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