linux – 如何在Perl中处理来自连续进程管道的更新
我试图在Fedora上跟踪Perl中的日志文件但不幸的是,Fedora使用journalctl来读取我无法直接解析的二进制日志文件.根据我的理解,这意味着我只能通过调用journalctl来阅读Fedora的日志文件.
我尝试使用 use IO::Pipe; my $p = IO::Pipe->new(); $p->reader("journalctl --follow"); #Waits for process to exit while (<$p>) { print; } 解决方法
我假设journalctl像tail -f一样工作.如果这是正确的,一个简单的开放应该做的工作:
use Fcntl; # Import SEEK_CUR my $pid = open my $fh,'|-','journalctl --follow' or die "Error $! starting journalctl"; while (kill 0,$pid) { while (<$fh>) { print $_; # Print log line } sleep 1; # Wait some time for new lines to appear seek($fh,SEEK_CUR); # Reset EOF } open打开一个文件句柄,用于读取被调用命令的输出:http://perldoc.perl.org/functions/open.html seek用于重置EOF标记:http://perldoc.perl.org/functions/seek.html不重置,所有后续< $fh>即使被调用的脚本在此期间发出了额外的输出,调用也只会返回EOF. kill 0,$pid只要open开始的子进程处于活动状态就为true. 你可以从 AnyEvent也应该能够通过 更新: 添加使用POSIX“:sys_wait_h”;在开头和waitpid $pid,WNOHANG)到外循环也会检测(并收获)一个僵尸的journalctl进程: while (kill(0,$pid) and waitpid($pid,WNOHANG) != $pid) { 守护进程可能还想检查$pid是否仍然是当前进程($$)的子进程,以及它是否仍然是原始的journalctl进程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |