nohup 使进程免受 shell 的 SIGHUP 的影响,但即使我从我的 shell 运行它:
bash -c 'while true; do sleep 1; date; done' >& nohup.out &
然后注销并重新登录,bash 仍在运行并将输出发送到 nohup.out。有什么区别吗?仅依靠重定向是否在任何方面都不太可靠?
答案1
在 bash 中,后台作业不需要受保护禁止
根据你的 bash 版本,行为可以改变。在信号手册页部分
如果已使用 shopt 设置了 huponexit shell 选项,则当交互式登录 shell 退出时,bash 会向所有作业发送 SIGHUP。
这舒巴坦选项默认为离开
答案2
nohup
允许您断开与 shell 的执行,
通常使用 nohuping 后台作业来避免在从远程 SSH 会话注销时终止它们。在这种情况下经常出现的另一个问题是 ssh 拒绝注销(“挂起”),因为它拒绝丢失来自/到后台作业的任何数据。
通过重定向所有三个 I/O 流也可以解决此问题:
nohup ./myprogram > foo.out 2> foo.err < /dev/null &
另一个参考SSH '挂断' 案例。