场景:
我们已经知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?
解决方法:
这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。
" 用disown -h jobspec 来使某个作业忽略HUP信号。
" 用disown -ah 来使所有的作业都忽略HUP信号。
" 用disown -rh 来使正在运行的作业忽略HUP信号。
需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
但是还有一个问题,这种方法的操作对象是作业,如果我们在运行命令时在结尾加了"&"来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!
CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec 来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。
disown 示例1(如果提交命令时已经用"&"将命令放入后台运行,则可以直接使用"disown")
[root@RHEL5 /]# cp -r /usr/share /tmp/tmp1 &
[1] 5944
[root@RHEL5 /]# jobs
[1]+ Running cp -i -r /usr/share /tmp/tmp1 &
[root@RHEL5 /]# disown -h %1
[root@RHEL5 /]# ps -ef | grep /usr/share
root 5944 5872 4 11:57 pts/1 00:00:01 cp -i -r /usr/share /tmp/tmp1
root 5951 5872 0 11:58 pts/1 00:00:00 grep /usr/share
[root@RHEL5 /]# logout
disown 示例2(如果提交命令时未使用"&"将命令放入后台运行,可使用 CTRL-z 和"bg"将其放入后台,再使用"disown")
[root@RHEL5 ~]# cp -r /usr/share /tmp/tmp1
[1]+ Stopped cp -i -r /usr/share /tmp/tmp1
[root@RHEL5 ~]# bg %1
[1]+ cp -i -r /usr/share /tmp/tmp1 &
[root@RHEL5 ~]# jobs
[1]+ Running cp -i -r /usr/share /tmp/tmp1 &
[root@RHEL5 ~]# disown -h %1
[root@RHEL5 ~]# ps -ef | grep /usr/share
root 6029 5956 0 12:01 pts/2 00:00:00 cp -i -r /usr/share /tmp/tmp1
root 6036 5956 0 12:02 pts/2 00:00:00 grep /usr/share
此时把该会话窗口关掉,重新一个窗口运行以下命令:
[root@RHEL5 ~]# ps -ef | grep /usr/share
root 6029 1 1 12:01 ? 00:00:03 cp -i -r /usr/share /tmp/tmp1
root 6087 6053 0 12:07 pts/1 00:00:00 grep /usr/share