原文链接:
https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/
简要tips:
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,让进程忽略 HUP 信号或者让进程运行在新的会话里从而成为不属于此终端的子进程.解决方案包括:
1. nohup
只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
引用
nohup ping www.ibm.com &
2.setsid
换个角度,进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点.
引用
setsid ping www.ibm.com
3.&
当将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了
引用
(ping www.ibm.com &)
4.disown
未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响?
用disown -h jobspec来使某个作业忽略HUP信号
用disown -ah 来使所有的作业都忽略HUP信号
用disown -rh 来使正在运行的作业忽略HUP信号
引用
disown -h %1
5.screen
如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做nohup操作,screen能解决这个问题,使用了 screen 后,在screen中运行的进程都是screen进程的子进程,而screen进程的父进程是1,不是用户进程
用screen -dmS session name来建立一个处于断开模式下的会话(并指定其会话名)。
用screen -list 来列出所有会话。
用screen -r session name来重新连接指定会话。