网络通信 频道

Linux 技巧:让进程在后台可靠运行的几种方法

  场景:
  我们已经知道,如果事先在命令前加上 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
 

0
相关文章