守护神是谁?

时间:2012-12-06 06:59:42

标签: linux daemon nohup

有许多技巧来守护linux进程,即在终端关闭后运行命令。

nohup用于此目的,并且fork() / setsid()组合可以在C程序中使用,以使自己成为守护进程。

以上是我对linux守护进程的了解,但今天我注意到退出终端并没有真正终止在命令末尾用&开始的进程。

$ while :; do echo "hi" >> temp.log ; done &
[1] 11108
$ ps -ef | grep 11108
username   11108 11076 83 15:25 pts/0    00:00:05 /bin/sh
username   11116 11076  0 15:25 pts/0    00:00:00 grep 11108
$ exit
(after reconnecting)
$ ps -ef | grep 11108
username   11108     1 91 15:25 pts/0    00:00:17 /bin/sh
username   11130 11540  0 15:25 pts/0    00:00:00 grep 11108

显然,进程的PPID变为1,意味着它以某种方式被守护。

这与我的知识相矛盾,&是不够的,必须使用nohup或其他技巧来处理进程'守护进程'。

有谁知道谁在做这个守护进程?

我使用的是CentOS 6.3主机,而putty / cygwin / sshclient也产生了相同的结果。

1 个答案:

答案 0 :(得分:4)

如果进程没有响应SIGHUP信号,您可以守护进程。

当bash shell在运行后台任务时终止时,bash shell会发送SIGHUP (挂断信号)到所有任务。但是bash不会等到子进程完全 终止。如果子进程没有响应SIGHUP信号,那么该进程就变成孤儿 处理。 (它的父pid更改为1 - init进程 - 以防止成为无用的僵尸进程)

子shell执行基本上不响应SIGHUP信号,因此从第一个shell注销后你的命令仍然会运行。