Linux下进程后台运行的几种方式

之前简单讨论了Linux下的会话与进程和一些多路复用终端的软件,Hadoop多用户作业调度器CentOS下tmux,screen,byobu安装与使用,这里再集中的探讨一下如何使得Linux下的进程安全可靠的在后台运行。 依然是SSH&Telnet的问题,当我们登录了远程服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口或网络断开连接或其他意外情况的干扰呢?之前我们介绍了nohup 和 screen(参见以上2篇文章内容),这次着重介绍一下setsid 、 & 和 disown。

setsid

nohup 可以通过忽略 HUP 信号来使我们的进程避免被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid 的帮助: [code] SETSID(1) Linux Programmer’s Manual SETSID(1) NAME setsid - run a program in a new session SYNOPSIS setsid program [arg…] DESCRIPTION setsid runs a program in a new session. SEE ALSO setsid(2) AUTHOR Rick Sladkey jrs@world.std.com AVAILABILITY The setsid command is part of the util-linux-ng package and is available from ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/. Linux 0.99 20 November 1993 SETSID(1) [/code] 举个例子,我们用setsid运行一个ping job: [code] [root@localhost hbase]# setsid ping www.google.com [root@localhost hbase]# ps -ef | grep www root 64312 1 0 07:48 ? 00:00:00 ping www.google.com root 64925 64776 0 07:49 pts/10 00:00:00 grep www [/code] 可以看到,setsid指定了job的父进程的进程号为1,也就是说,这个job已经不是当前终端的子进程了。

&

我们知道,将命名包含在“()”中就能让这些命令在子 shell 中运行,而当我们将”&”也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。这样就巧妙的避开了HUP信号,起到了安全后台运行的作用。 [code][root@localhost hbase]# (ping www.google.com &) [root@localhost hbase]# ps -ef | grep www root 5328 1 0 07:54 pts/10 00:00:00 ping www.google.com root 5527 5395 0 07:54 pts/11 00:00:00 grep www[/code] 这里看到,& 与 setsid的情况相同,父进程的进程号变成了1。

disown

如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢? 这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。对于disown有以下几种使用方式:

  • 用disown -h jobspec 使某个作业忽略HUP信号。
  • 用disown -ah 使所有的作业都忽略HUP信号。
  • 用disown -rh 使正在运行的作业忽略HUP信号。
    当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。 使用示例: [code] [root@localhost hbase]# ping www.google.com ^Z [1]+ Stopped ping www.google.com [root@localhost hbase]# jobs [1]+ Stopped ping www.google.com [root@localhost hbase]# bg %1 [1]+ ping www.google.com & [root@localhost hbase]# disown -h %1 [root@localhost hbase]# ps -ef | grep www root 13196 5395 0 08:02 pts/11 00:00:00 ping www.google.com root 17803 13349 0 08:07 pts/8 00:00:00 grep www
     [/code] 这里举的例子是在完全没有进行后台运行的情况下使用disown,当然也可以先用&再使用disown进行操作。 如果是大批量的操作,还是建议使用screen/tmux/byobu一类的多终端软件。 
  • 版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
  • 转载请注明:Chentao’s Home