我正在尝试解决一个奇怪的问题。我有证据表明我将尾部输出传输到的脚本是问题的原因,但我不确定要寻找什么。这是我得到的:
我有一个 java 程序,它生成一个日志到 stdout,我用它合并 stderr (2>&1) 并重定向到一个文件。我运行一个单独的 shell 脚本,该脚本执行 tail -F,将其通过管道传输到 Perl 脚本,该脚本对日志中的事件进行操作并且永不退出。
这不是最好的设计,但多年来一切都有效,直到最近(过去几个月)。 jar 文件存在明显的问题,因为日志中积累了大量错误,因此第一步,我更新到了最新版本。然而,在我上面描述的设置中,新版本停止向日志添加条目。
为了缩小问题范围,我做了以下操作:
tail -F log | perl -pne ‘$|=1;’
tail -F log
这表明输出继续流动,并表明脚本正在执行的操作导致了问题。
但是,这似乎并不是故事的全部,因为当我在另一台计算机上运行所有内容时,那里的所有内容都可以正常工作!仅在特定计算机上,jar 才会停止打印到日志。
其他详细信息:
- java 进程在所有情况下都会继续运行。
- 在后台运行所有内容后,我正在通过再次执行
tail -F
进行测试 - 可能是操作系统更新导致了该问题
- 在 bash shell 中运行
- 我更新了一个与 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 搜索功能就会完成并写入一条消息,说明尽可能多的内容到日志中。
但是,当我将日志尾部通过管道传输到脚本时,似乎事件尝试停止,例如在 socket 打开或关闭或检测到运动时写入的内容。如果我不将日志的尾部通过管道传输到 Perl 脚本,所有设备事件都会在发生时写入日志。这就好像java进程失去了与设备的通信能力。
我知道 bonjour 用于发现设备并将其 IP 地址打印到日志中,所以我不知道中断可能是什么。我的 Perl 脚本绝对不会对 ports 或 bonjour 或任何东西做任何事情。它只是解析 STDIN 上的文件。
我想我可以尝试更新操作系统,因为它比我的笔记本电脑有 2 个版本可以运行,但我想了解发生了什么。
最佳答案
我问错问题了。是的,输出正在停止,但是输出的停止恰好是通过连接到输出流来催化的。即使不管怎样,输出的结束最终也会发生。
它停止的真正原因是因为我有 2 个单独的 WeMo 设备订阅,而它只支持 1 个。
关于java - 将日志尾部通过管道传输到脚本如何导致生成日志的进程停止生成条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59271195/