1

有多种技巧可以守护一个 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 产生了相同的结果。

4

1 回答 1

4

如果进程不响应 SIGHUP 信号,您可以将其守护进程。

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

Subshel​​l 执行基本上不响应 SIGHUP 信号,因此您的命令在从第一个 shell 注销后仍将运行。

于 2012-12-06T16:47:48.160 回答