如何将日志尾部传递到脚本,导致生成日志的过程停止生成条目?

问题描述 投票:0回答:1

我正在尝试解决一个奇怪的问题。我有证据表明,我将尾巴输出传递到的脚本是造成此问题的原因,但我不确定要查找的内容。这是我所拥有的:

我有一个Java程序,该程序生成一个输出到stdout的日志,并与stderr(2>&1)合并并重定向到文件。我运行一个单独的shell脚本,该脚本执行尾-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搜索功能将完成并在日志中写出一条说明尽可能多的消息。

但是,当我将日志尾部传送到脚本时,似乎事件尝试停止,例如当插座打开或关闭或检测到运动时写入该事件。如果我不将日志尾部传送到我的Perl脚本中,则所有设备事件都会在发生时立即写入日志。好像Java进程失去了与设备的通信能力。

我知道bonjour用于发现设备,并将其IP地址打印到日志中,所以我不知道会发生什么中断。我的Perl脚本绝对不会对port或bonjour或任何东西起作用。它只是解析STDIN上的文件。

我想我可以尝试更新操作系统,因为它在我的笔记本电脑后面有两个版本,但可以运行,但是我想了解发生了什么。

我正在尝试解决一个奇怪的问题。我有证据表明,我将尾巴输出传递到的脚本是造成此问题的原因,但我不确定要查找的内容。这是我得到的:我有一个...

java perl io bonjour
1个回答
0
投票

我问错了问题。是的,输出正在停止,但是通过连接到输出流来催化了输出的停止。即使结束,输出最终也会发生。

© www.soinside.com 2019 - 2024. All rights reserved.