当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
nohup
nohup 的用途就是让提交的命令忽略 hangup 信号。
nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
[root@pvcent107 ~]# nohup ping www.ibm.com &
setsid
setsid 可以让进程忽略HUP信号,做到命令后台执行的效果。
setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。
如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?
可以通过作业调度和 disown 来解决这个问题。
用disown -h jobspec来使某个作业忽略HUP信号。
用disown -ah 来使所有的作业都忽略HUP信号。
用disown -rh 来使正在运行的作业忽略HUP信号。
当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
& 的作用
& 放在启动参数后面表示设置此进程为后台进程