我尝试使用IO::Pipe
来做到这一点,但问题是$p-> reader(..)等到journalctl –follow完成写入输出(这将永远不会,因为–follow就像tail -F)然后允许我打印出不是我想要的东西.我希望能够设置一个回调函数,每次将新行打印到流程管道时调用,以便我可以解析/处理每个新的日志事件.
use IO::Pipe;my $p = IO::Pipe->new();$p->reader("journalctl --follow"); #Waits for process to exitwhile (<$p>) { print;}@H_404_14@解决方法 我假设journalctl像tail -f一样工作.如果这是正确的,一个简单的开放应该做的工作:use Fcntl; # import SEEK_CURmy $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}@H_404_14@open打开一个文件句柄,用于读取被调用命令的输出:http://perldoc.perl.org/functions/open.html
seek用于重置EOF标记:http://perldoc.perl.org/functions/seek.html不重置,所有后续< $fh>即使被调用的脚本在此期间发出了额外的输出,调用也只会返回EOF.
kill 0,$pID只要open开始的子进程处于活动状态就为true.
你可以从
Time::HiRes
用usleep替换sleep 1或者选择undef,undef,$fractional_seconds;等待不到一秒,具体取决于进线的频率.AnyEvent也应该能够通过
AnyEvent::Handle
完成这项工作.更新:
添加使用POSIX“:sys_wait_h”;在开头和waitpID $pID,WNOHANG)到外循环也会检测(并收获)一个僵尸的journalctl进程:
while (kill(0,$pID) and waitpID($pID,WNOHANG) != $pID) {@H_404_14@守护进程可能还想检查$pID是否仍然是当前进程($$)的子进程,以及它是否仍然是原始的journalctl进程.
总结以上是内存溢出为你收集整理的linux – 如何在Perl中处理来自连续进程管道的更新全部内容,希望文章能够帮你解决linux – 如何在Perl中处理来自连续进程管道的更新所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)