[英]How can piping tail of a log to a script cause the process generating the log to stop generating entries?
我正在尝试解决一个奇怪的问题。 我有证据表明我将尾部输出传递到的脚本是问题的原因,但我不确定要查找什么。 这是我所拥有的:
我有一个 java 程序,它生成一个日志到 stdout,我将其合并 stderr (2>&1) 并重定向到一个文件。 我运行一个单独的 shell 脚本,该脚本执行 tail -F 将其传送到 Perl 脚本,该脚本对日志中的事件进行操作并且永不退出。
这不是最好的设计,但直到最近(过去几个月),一切都已经奏效了多年。 jar 文件有一个明显的问题,因为日志已经积累了大量的错误,所以作为第一步,我更新到了最新版本。 然而,在我上面描述的设置中,新版本停止向日志添加条目。
为了缩小问题的范围,我做了以下工作:
tail -F log | perl -pne ‘$|=1;’
tail -F log
这表明输出继续流动,并表明脚本正在执行的某些操作导致了问题。
然而,这似乎并不是全部,因为当我在不同的计算机上运行所有东西时,那里的一切都可以工作! 它仅在特定计算机上 jar 停止打印到日志。
其他详情:
tail -F
进行测试java -cp WemoServer.jar mpp.wemo.server.Headless -p 4033 -upnp -run -log >> WemoServer.log 2>&1 &
sh -c "tail -F WemoServer.log | ./WemoServerLogProcessor.pl -r rules.txt --extended" 2>&1 >> WemoParser.log &
#And I'm testing whether the java process stops generating output via:
tail -F WemoServer.log
我很难过如何调试这个问题。 我应该寻找什么?
更新:我了解到 java 进程仍然可以写入日志。 我知道这一点,因为如果我让它运行足够长的时间,并且初始 bonjour 搜索功能完成并向日志写入一条消息。
但是,当我将日志的尾部通过管道传输到我的脚本时,似乎事件尝试停止,例如在插座打开或关闭或检测到运动时写入。 如果我不将日志的尾部通过管道传送到我的 Perl 脚本,所有设备事件都会在发生时写入日志。 就好像java进程失去了与设备的通信能力。
我知道 bonjour 用于发现设备并将其 IP 地址打印到日志中,所以我不知道中断可能是什么。 我的 Perl 脚本绝对不会对 port 或 bonjour 或任何东西做任何事情。 它只是解析 STDIN 上的文件。
我想我可以尝试更新操作系统,因为它是我的笔记本电脑后面的 2 个版本,但我想了解发生了什么。
我问错了问题。 是的,输出正在停止,但是输出的停止恰好是通过连接到输出流来催化的。 即使单独留下,输出的结束最终也会发生。
它停止的真正原因是因为我对 WeMo 设备有 2 个单独的订阅,而它只支持 1 个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.