当文件由另一个程序写入时,是否可以使用 perl/ajax 逐行读取文件?

Is it possible to use perl/ajax to read a file line by line while the file is written by another program?

这与此处提出的问题类似How to read from file line by line using ajax request while file is written by other program using java? 我有一个文件,该文件将填充远程计算机生成的命令行输出。我想做的是每次在文件中写入内容时,我想使用 perl(或 javascript 但我对此很怀疑)来捕获它并显示在打开的网页中写入的内容。理想情况下,每一行都应该在 html 中显示在文件中,就像它在终端中生成的方式一样。

我的困难在于我不确定应该如何进行轮询 - 检测文件中是否正在写入某些内容 - 以及如何实时捕获该行。

也就是说,我想到的另一种可能性是更改远程计算机上的脚本并将终端输出转储到我网站的 div 中。这将避免写入、读取和实时轮询,但甚至不确定这是否可能?

暂时忽略 AJAX,Perl 程序通常会使用 File::Tail

使用 AJAX,您可能需要重新实现 File::Tail。以下为基础版:

#!/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,
   }));
}