linux – 如何在Perl中处理来自连续进程管道的更新
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 如何在Perl中处理来自连续进程管道的更新,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1625字,纯文字阅读大概需要3分钟。
内容图文
![linux – 如何在Perl中处理来自连续进程管道的更新](/upload/InfoBanner/zyjiaocheng/966/9ea00e6021f5493cba89bf09d54e6f51.jpg)
我试图在Fedora上跟踪Perl中的日志文件但不幸的是,Fedora使用journalctl来读取我无法直接解析的二进制日志文件.根据我的理解,这意味着我只能通过调用journalctl来阅读Fedora的日志文件.
我尝试使用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 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,0,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.
你可以从Time::HiRes用usleep替换sleep 1或者选择undef,undef,undef,$fractional_seconds;等待不到一秒,具体取决于进线的频率.
AnyEvent也应该能够通过AnyEvent::Handle完成这项工作.
更新:
添加使用POSIX“:sys_wait_h”;在开头和waitpid $pid,WNOHANG)到外循环也会检测(并收获)一个僵尸的journalctl进程:
while (kill(0, $pid) and waitpid($pid, WNOHANG) != $pid) {
守护进程可能还想检查$pid是否仍然是当前进程($$)的子进程,以及它是否仍然是原始的journalctl进程.
内容总结
以上是互联网集市为您收集整理的linux – 如何在Perl中处理来自连续进程管道的更新全部内容,希望文章能够帮你解决linux – 如何在Perl中处理来自连续进程管道的更新所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。