2016-07-15 43 views
4

它类似于问题这里How to read from file line by line using ajax request while file is written by other program using java?被要求我有,将与从远程机器产生的命令行输出被填充的文件。我想要做的是每次写入文件时,我都想使用perl(或javascript,但我非常可疑)来捕获它并显示正在打开的网页中正在写入的内容。理想情况下,只要在文件中将每行显示在html中,就像它在终端中的生成方式一样。当文件被另一个程序写入时,是否有可能使用perl/ajax逐行读取文件?

我的困难是,我不知道我应该怎么办轮询 - 检测的东西正在被写入文件 - 以及如何我可以捕捉实时行。

话虽这么说,我已经想到了另一种可能性是改变远程机器上我的脚本和转储端子输出到我的网站的一个div。这将避免写作,阅读和实时轮询,但甚至不确定这是否可能?

+1

我会使用WebSockets而不是AJAX。 – ThisSuitIsBlackNot

+0

如果您确实使用了持久连接(例如WebSockets),那么您可以使用File :: Tail本身。 – ikegami

+0

你们会介意在websockets上详细阐述一下吗?我真的不认为我的程序使用它atm(或者我可能是错的) – idleonbench

回答

7

忽略AJAX用于第二,Perl程序通常会使用File::Tail

使用AJAX,你可能需要重新实现文件::尾。以下是基本版本:

#!/usr/bin/perl 

use strict; 
use warnings; 

use CGI   qw(); 
use Fcntl  qw(SEEK_SET); 
use Text::CSV_XS qw(decode_json encode_json); 

my $qfn = '...'; 

{ 
    my $cgi = CGI->new(); 
    my $request = decode_json($cgi->param('POSTDATA') || '{}'); 
    my $offset = $request->{offset} || 0; 

    open(my $fh, '<:raw', $qfn) 
     or die("Can't open \"$qfn\": $!\n"); 

    seek($fh, $offset, SEEK_SET) 
     or die("Can't seek: $!\n"); 

    my $data = ''; 
    while (1) { 
     my $rv = sysread($fh, $data, 64*1024, length($data)); 
     die("Can't read from \"$qfn\": $!\n") if !defined($rv); 
     last if !$rv; 
    } 

    $offset .= length($data); 

    print($cgi->header('application/json')); 
    print(encode_json({ 
     data => $data, 
     offset => $offset, 
    })); 
} 
相关问题