linux进程后台运行的几种方法

YaoGUET 2014-12-12

原文链接:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

简要tips:

当用户注销(logout)或者网络断开时,终端会收到HUP(hangup)信号从而关闭其所有子进程。因此,让进程忽略HUP信号或者让进程运行在新的会话里从而成为不属于此终端的子进程.解决方案包括:

1.nohup

只需在要处理的命令前加上nohup即可,标准输出和标准错误缺省会被重定向到nohup.out文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename2>&1"来更改缺省的重定向文件名。

引用
nohup ping www.ibm.com &

2.setsid

换个角度,进程不属于接受HUP信号的终端的子进程,那么自然也就不会受到HUP信号的影响了。setsid就能帮助我们做到这一点.

引用
setsid ping www.ibm.com

3.&

当将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。新提交的进程的父ID(PPID)为1(init进程的PID),并不是当前终端的进程ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的HUP信号的影响了

引用
(ping www.ibm.com &)

4.disown

未加任何处理就已经提交了命令,该如何补救才能让它避免HUP信号的影响?

用disown-hjobspec来使某个作业忽略HUP信号

用disown-ah来使所有的作业都忽略HUP信号

用disown-rh来使正在运行的作业忽略HUP信号

引用
disown -h %1

5.screen

如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做nohup操作,screen能解决这个问题,使用了screen后,在screen中运行的进程都是screen进程的子进程,而screen进程的父进程是1,不是用户进程

用screen-dmSsessionname来建立一个处于断开模式下的会话(并指定其会话名)。

用screen-list来列出所有会话。

用screen-rsessionname来重新连接指定会话。

相关推荐