将日志尾部管道到脚本如何导致生成日志的进程停止生成条目?



我正在尝试解决一个奇怪的问题。我有证据表明我正在管道尾输出的脚本是问题的原因,但我不确定要寻找什么。这是我得到的:

我有一个java程序,可以生成一个日志到stdout,我用它合并stderr(2>&1(并重定向到一个文件。我运行一个单独的 shell 脚本,该脚本执行尾巴 -F,将其管道传输到 Perl 脚本,该脚本对日志中的事件进行操作并且永远不会退出。

这不是最好的设计,但直到最近(过去几个月(,一切都已经工作了多年。jar 文件存在明显的问题,因为日志积累了大量错误,因此作为第一步,我更新到最新版本。但是,在我上面描述的设置中,新版本停止向日志添加条目。

为了缩小问题范围,我做了以下工作:

tail -F log | perl -pne ‘$|=1;’
tail -F log

这表明输出继续流动,并表明脚本正在执行的操作导致了问题。

但是,这似乎并不是故事的全部,因为当我在不同的计算机上运行所有内容时,那里的所有内容都可以正常工作!它仅在 jar 停止打印到日志的特定计算机上。

其他细节:

  • Java 进程在所有情况下都会继续运行。
  • 我在后台运行所有内容后再次通过执行tail -F进行测试
  • 可能是操作系统更新导致了此问题
  • 在猛击壳中奔跑
  • 更新了一个perl脚本使用的模块,但是它工作的计算机和停止java输出的计算机之间显然存在细微差异,我尚未调查
  • 以下是我用于测试的实际命令:
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。

最新更新