【问题标题】:Is it possible to use perl/ajax to read a file line by line while the file is written by another program?当文件由另一个程序写入时,是否可以使用 perl/ajax 逐行读取文件?
【发布时间】:2016-11-19 01:43:40
【问题描述】:

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

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

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

【问题讨论】:

  • 我会使用 WebSockets 而不是 AJAX。
  • 如果您确实使用了持久连接(例如 WebSockets),那么您可以使用 File::Tail 本身。
  • 你们介意再详细说明一下 websockets 吗?我真的不认为我的程序在 atm 使用它(或者我可能是错的)

标签: ajax bash perl ssh real-time


【解决方案1】:

暂时忽略 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,
   }));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2016-04-27
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多