idl*_*nch 4 ajax ssh bash perl real-time
它类似于这里提出的问题如何使用ajax请求逐行读取文件,而文件是由其他程序使用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,
}));
}
Run Code Online (Sandbox Code Playgroud)