我有一个Java程序,该程序正在Mac OS X上使用Bash脚本运行。我有两个文件-允许我将命令传递到程序中的FIFO和输出日志文件。
Bash脚本由以下代码组成:
#!/bin/bash
java -jar file.jar <./run/command-fifo >>./run/server.log 2>&1 &
echo $! >| ./run/server.pid
老实说,我不记得为什么>|
在第三行中使用过(我只知道它有效)。在Java行中,第一个<
将fifo文件重定向到标准输入。本>>
应标准输出重定向到文件,并2>&1
应标准错误重定向到它。然后,它在后台运行。
问题是什么都没有写入到server.log文件中。读取了命令fifo文件,但未写入日志。该程序正在写入标准输出(如果我自己运行它,则可以正常运行)。
我也script
按照这个问题的建议进行了尝试,但是它也不起作用:
script -q /dev/null java -Xmx4G -Xms4G -jar current.jar --nogui <./run/command-fifo >>./run/server.log 2>&1 &
任何人都有想法将此正确写入日志吗?
后续行动:为了使这种解释有意义,我应该对软件的工作方式进行更多说明。这里分为三个部分:
launchd
用于在启动时通过调用启动脚本来启动程序上面给出的脚本是开始脚本。这将启动java进程,将其pid回显到文件,然后返回。然后,启动器脚本(此处未给出)在终止之前等待pid退出。如果终止,则launchd会自动重新启动启动器脚本。
“启动”具有可以为其启动的文件设置标准输出路径的功能。本质上,它将启动程序脚本的标准输出重定向到给定文件。
我这样做了,瞧,它成功了。通过将启动脚本行更改为以下内容:
java -jar file.jar <>./run/command-fifo &
它允许通过启动捕获标准输出并将其写入文件。这是一个不同的解决方案,但实际上确实可以。奇怪的是,由于Java进程处于后台,因此启动器脚本在技术上没有任何输出,但是无论如何,它实际上都可以工作。
当然,我更愿意将文件的标准输出显式重定向到文件中(在其他脚本中,可能存在不止一个的情况,因此我需要将它们分开)。我仍将继续尝试并尝试找到解决方案。
我认为@torek关于缓冲的评论可能是对的。您可以java
使用stdbuf
实用程序强制您的进程对输出进行行缓冲:
#!/bin/bash
stdbuf -oL java -jar file.jar <./run/command-fifo >>./run/server.log 2>&1 &
echo $! >| ./run/server.pid
关于>|
运算符,@ torek也是正确的。这是bash手册条目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句