【问题标题】:Does nohup work across a pipe?nohup 是否可以跨管道工作?
【发布时间】:2014-11-13 15:11:10
【问题描述】:

如果我这样做

nohup cmd1 | cmd2 &

是一样的

nohup "cmd1 | cmd2" &

?

我希望我 nohup 一切,因为 cmd1 将侦听端口 8023。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    不,您需要将 nohup 单独添加到命令中。

    推荐这样的:

    nohup sh -c "cmd1 | cmd2" &
    

    或者:

    nohup $SHELL <<EOF &
    cmd1 | cmd2
    EOF
    

    【讨论】:

    • 谁能解释一下$SHELL是什么以及我们为什么需要它?
    • $SHELL 包含您当前运行的 shell,在大多数 Linux 系统上,这将是 /bin/bash,但它可能是 /usr/bin/zsh 或其他。使用$SHELL 变量的优点是,这样命令将使用您的常规 shell 设置执行。
    • @RoVo:EOF 依赖于较早的EOF,是类 bash 外壳中多行输入的标准。如果您将&lt;&lt;EOF 更改为其他名称,最后的EOF 也需要更改。您使用的是哪个 shell(和版本)?
    • 我没有更改第一个 EOF。 EOF 有效,但 EOF &amp; 无效。只是打开一个新行。我使用 GNU bash,版本 4.3.48(1)-release (x86_64-pc-linux-gnu)。第一个选项对我有用,只需要 bash -c 来拥有 bash 内置函数。
    • @RoVo 我想我可能将&amp; 放置在原始答案的错误位置,请尝试更新后的答案:)
    【解决方案2】:

    作为nohup 的替代品,我推荐

    ( cmd1 | cmd2 ) > logfile < /dev/null 2>&1 &
    

    通过从终端重新路由 stdin、stdout 和 sterr,这可以达到与 nohup 大致相同的效果,但语法至少是我更喜欢的。

    【讨论】:

    • 这并不能像nohup 那样保护命令免受 HUP 信号的影响。你需要(trap "" HUP; cmd1 | cmd2 ) &lt;/dev/null &gt; logfile 2&gt;&amp;1 &amp; 才能做到这一点。
    • 没错,但正如所写,它确实阻止关闭终端首先将 HUP 发送到进程。
    • 很遗憾,以这种方式创建的进程在关闭终端时仍然会被杀死。
    • @scribu 根据我的经验,它没有。我已经使用这种方法在终端关闭多次后继续处理。
    【解决方案3】:

    您总是可以创建一个脚本文件并使用 nohup 运行它:

    echo "cmd1 | cmd2" > nohupScript.sh
    nohup nohupScript.sh &
    

    【讨论】:

      【解决方案4】:

      您可以在screen 会话中启动您的管道。击键 Ctrl-a 然后 d 将从终端分离屏幕会话。然后,您可以安全地退出终端;管道将继续运行。使用screen -r 重新连接到会话。

      【讨论】:

        【解决方案5】:
        nohup cmd1 | cmd2 &
        

        不是,我刚才查了一下是这样的

        nohup: ignoring input and redirecting stderr to stdout
        

        【讨论】:

        • @JasmineLognnes 链接包含与我的答案一起发布的相同错误消息。
        猜你喜欢
        • 2021-05-23
        • 1970-01-01
        • 2014-05-18
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        相关资源
        最近更新 更多