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