Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash输入和输出重定向_Bash_Redirect_Background Process - Fatal编程技术网

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 有人有办法让它正确地写入日志吗 后续:为了让这个解释有意义,我应该多解释一下软

我有一个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
有人有办法让它正确地写入日志吗

后续:为了让这个解释有意义,我应该多解释一下软件是如何工作的。这里有三个部分在起作用:

  • launchd
    用于通过调用启动程序脚本在启动时启动程序的plist
  • 处理kill信号并等待java进程的pid的启动程序脚本
  • 启动程序脚本调用的启动脚本,用于启动程序并保存其pid
  • 上面给出的脚本是开始脚本。这将启动java进程,将其pid回显到文件,然后返回。然后,启动程序脚本(此处未给出)在终止之前等待pid退出。如果终止,launchd将自动重新启动启动程序脚本

    Launchd有一个功能,可以为它启动的文件设置标准输出路径。本质上,它将启动程序脚本的stdout重定向到给定的文件

    我做了这件事,瞧,它成功了。通过将开始脚本行更改为以下内容:

    java -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