【发布时间】:2014-11-13 15:11:10
【问题描述】:
如果我这样做
nohup cmd1 | cmd2 &
是一样的
nohup "cmd1 | cmd2" &
?
我希望我 nohup 一切,因为 cmd1 将侦听端口 8023。
【问题讨论】:
如果我这样做
nohup cmd1 | cmd2 &
是一样的
nohup "cmd1 | cmd2" &
?
我希望我 nohup 一切,因为 cmd1 将侦听端口 8023。
【问题讨论】:
不,您需要将 nohup 单独添加到命令中。
推荐这样的:
nohup sh -c "cmd1 | cmd2" &
或者:
nohup $SHELL <<EOF &
cmd1 | cmd2
EOF
【讨论】:
$SHELL是什么以及我们为什么需要它?
$SHELL 包含您当前运行的 shell,在大多数 Linux 系统上,这将是 /bin/bash,但它可能是 /usr/bin/zsh 或其他。使用$SHELL 变量的优点是,这样命令将使用您的常规 shell 设置执行。
EOF 依赖于较早的EOF,是类 bash 外壳中多行输入的标准。如果您将<<EOF 更改为其他名称,最后的EOF 也需要更改。您使用的是哪个 shell(和版本)?
EOF 有效,但 EOF & 无效。只是打开一个新行。我使用 GNU bash,版本 4.3.48(1)-release (x86_64-pc-linux-gnu)。第一个选项对我有用,只需要 bash -c 来拥有 bash 内置函数。
& 放置在原始答案的错误位置,请尝试更新后的答案:)
作为nohup 的替代品,我推荐
( cmd1 | cmd2 ) > logfile < /dev/null 2>&1 &
通过从终端重新路由 stdin、stdout 和 sterr,这可以达到与 nohup 大致相同的效果,但语法至少是我更喜欢的。
【讨论】:
nohup 那样保护命令免受 HUP 信号的影响。你需要(trap "" HUP; cmd1 | cmd2 ) </dev/null > logfile 2>&1 & 才能做到这一点。
您总是可以创建一个脚本文件并使用 nohup 运行它:
echo "cmd1 | cmd2" > nohupScript.sh
nohup nohupScript.sh &
【讨论】:
您可以在screen 会话中启动您的管道。击键 Ctrl-a 然后 d 将从终端分离屏幕会话。然后,您可以安全地退出终端;管道将继续运行。使用screen -r 重新连接到会话。
【讨论】:
nohup cmd1 | cmd2 &
不是,我刚才查了一下是这样的
nohup: ignoring input and redirecting stderr to stdout
【讨论】: