Bash输入和输出重定向
我有一个Java程序,在Mac OS X上使用Bash脚本运行。我有两个文件——一个FIFO,允许我将命令导入程序,一个输出日志文件 Bash脚本由以下代码组成:Bash输入和输出重定向,bash,redirect,background-process,Bash,Redirect,Background Process,我有一个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 有人有办法让它正确地写入日志吗 后续:为了让这个解释有意义,我应该多解释一下软
#!/bin/bash
java -jar file.jar <./run/command-fifo >>./run/server.log 2>&1 &
echo $! >| ./run/server.pid
有人有办法让它正确地写入日志吗
后续:为了让这个解释有意义,我应该多解释一下软件是如何工作的。这里有三个部分在起作用:
launchd
用于通过调用启动程序脚本在启动时启动程序的plistjava -jar file.jar <>./run/command-fifo &
java-jar file.jar./run/command fifo&
它允许launchd捕获标准输出并将其写入文件。这是一个有点不同的解决方案,但它确实有效。这很奇怪,因为从技术上讲,启动程序脚本没有任何输出,因为java进程在后台,但不管它如何工作,它确实以某种方式工作
当然,我更喜欢显式地将文件的标准输出重定向到一个文件中(在其他脚本中,可能有多个脚本,我需要将它们分开)。我仍在尝试并试图找到解决方案。我认为@torek关于缓冲的评论可能是正确的。您可以使用以下命令强制
java
进程对其输出进行行缓冲:
#/bin/bash
stdbuf-oL java-jar file.jar>/run/server.log 2>&1&
echo$!>|/运行/server.pid
关于
|
操作符,@torek也是正确的 我不是java专家,但我敢打赌您的java程序只是在缓冲输出(可能会在输出大小达到8K或64K字节时写入)。同时,|
重定向操作符意味着“写入文件,即使它存在,并且我也执行了设置-o noclobber
,这样您通常会拒绝重定向,并错误地说文件存在”。更令人难忘的是,这个烟斗的意思是:“我真的是认真的!”谢谢。不幸的是,stdbuf
(和看起来类似的unbuffer
)没有安装在Mac OS X上,也没有正式提供。我正在寻找安装它们的方法,但这可能是不可能的。我确实尝试了script-q/dev/null java-Xmx4G-Xms4G-jar current.jar--nogui>/run/server.log 2>&1&
,但这也不起作用。@JustinMrkva-对不起,我不确定这里发生了什么。我可以让script-q
在本例中工作:for((I=0;I++);不要重复$i;睡眠0.001;完成| grep.>>server.log
-此处grep
缓冲其重定向到文件的过程-您可以通过tail-f
对文件进行加密来查看这一点。但是如果您为((i=0;i++)执行;不要重复$i;睡眠0.001;完成|脚本-q/dev/null grep.>>server.log
然后您会看到文件不断更新。请参阅上面的后续内容。我让它以不同的方式工作。我认为java程序本身可能与奇怪的行为有关,但我不知道。我运行了你的脚本,我看到的与你的结果一致。
java -jar file.jar <>./run/command-fifo &
#!/bin/bash
stdbuf -oL java -jar file.jar <./run/command-fifo >>./run/server.log 2>&1 &
echo $! >| ./run/server.pid