Bash,后台与nohup

老式的Bourne shell在退出以后,其中运行的子进程也就退出了。这是因为,在shell中运行的程序都是shell的子进程,和shell处在同一个进程组,当 shell退出时,子进程也同时接收到SIGHUP信号,从而退出。所以,通常使用nohup来运行需要shell退出后继续执行的程序。nohup会将 进程交给1号进程init收养,和shell进程脱离关系,即使shell退出程序仍然可以继续运行。

然而最近蒙人提点,发现,在bash中及时不使用nohup,只将程序放在后台运行,在bash退出后程序仍然在继续执行,其父进程变成了init。

原来,较新的如bash,tch之类的shell,后台进程是放在单独的进程组里,和shell不在同一个进程组中,这样shell退出时就不会直 接接收到操作系统发送的SIGHUP信号,从而后台的子进程在shell退出以后存活下来。而Unix/Linux系统中,所有的进程都必须有自己的父进 程,当操作系统发现这个进程没有父进程后,就会被被init收养。

然而,如果bash直接收到了SIGHUP信号,而不是用exit正常退出(例如远程ssh时断线),它仍然会将SIGHUP信号发送给子进程,使 运行在本shell中的所有程序终止。这种情况下,可以使用bash内置的disown命令,使bash不向子进程转发SIGHUP信号,或者将程序放在 一个子shell中运行(用括号括起命令)来解决这个问题。

另一个问题是,bash不会重定向进程的输入输出,所以当程序有向tty的输出时,会由于找不到设备而出错。这种情况就只能使用nohup了。

posted @ 2013-01-05 11:34  IT屁民  阅读(4118)  评论(0编辑  收藏  举报