Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当文件由另一个程序编写时,是否可以使用perl/ajax逐行读取文件?_Ajax_Bash_Perl_Ssh_Real Time - Fatal编程技术网

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

当文件由另一个程序编写时,是否可以使用perl/ajax逐行读取文件?,ajax,bash,perl,ssh,real-time,Ajax,Bash,Perl,Ssh,Real Time,这与这里提出的问题类似,我有一个文件,其中将填充远程机器生成的命令行输出。我想做的是,每次在文件中写入内容时,我都想使用perl(或javascript,但我对此相当怀疑)来捕获它并显示在打开的网页中正在写入的内容。理想情况下,每一行在写入文件后都应该以html的形式显示,就像在终端中生成一样 我的困难在于,我不确定应该如何进行轮询——检测文件中正在写入的内容——以及如何实时捕获该行 话虽如此,我想到的另一种可能性是在远程机器上更改脚本,并将终端输出转储到我网站的div中。这将避免写入、读取和实

这与这里提出的问题类似,我有一个文件,其中将填充远程机器生成的命令行输出。我想做的是,每次在文件中写入内容时,我都想使用perl(或javascript,但我对此相当怀疑)来捕获它并显示在打开的网页中正在写入的内容。理想情况下,每一行在写入文件后都应该以html的形式显示,就像在终端中生成一样

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


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

忽略AJAX一秒钟,Perl程序通常会使用

使用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,
   }));
}
#/usr/bin/perl
严格使用;
使用警告;
使用cgiqw();
使用Fcntl qw(搜索集);
使用Text::CSV_XS qw(decode_json encode_json);
我的$qfn=“…”;
{
my$cgi=cgi->new();
我的$request=decode_json($cgi->param('POSTDATA')||'{}');
我的$offset=$request->{offset}| | 0;

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