【IT168 专稿】nohup ---nohup 的用途就是让提交的命令忽略 hangup 信号。
[root@RHEL5 ~]# nohup ping aix43 &
[1] 5634
[root@RHEL5 ~]# nohup: appending output to `nohup.out'
[root@RHEL5 ~]# ps -ef | grep 5634
root 5634 5551 0 11:23 pts/1 00:00:00 ping aix43
root 5636 5551 0 11:23 pts/1 00:00:00 grep 5634
setsid ---nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。
[root@RHEL5 ~]# setsid ping aix43
[root@RHEL5 ~]# ps -ef | grep ping
root 5670 1 0 11:26 ? 00:00:00 ping aix43
root 5708 5677 0 11:28 pts/1 00:00:00 grep ping
& ---当我们将"&"也放入"()"内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。
[root@RHEL5 ~]# (ping aix43 &)
[root@RHEL5 ~]# ps -ef | grep ping
root 5761 1 0 11:35 ? 00:00:00 ping aix43
root 5765 5728 0 11:36 pts/2 00:00:00 grep ping
disown ---
场景:
我们已经知道,如果事先在命令前加上 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