有多种技巧可以使 linux 进程守护进程,即在终端关闭后运行命令。
nohup
用于此目的,fork()
/setsid()
组合可用于 C 程序中使其自身一个守护进程。
以上是我对 linux daemon 的了解,但今天我注意到退出终端并没有真正终止命令末尾以 &
开始的进程。
$ 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 产生了相同的结果。
最佳答案
如果进程不响应 SIGHUP 信号,您可以将其守护进程。
当 bash shell 在运行后台任务时终止,bash shell 发送 SIGHUP (挂断信号)到所有任务。但是 bash 不会等到子进程完成 终止。如果子进程不响应 SIGHUP 信号,则该进程成为孤儿 过程。 (其父进程pid改为1——init进程——防止成为无用的僵尸进程)
子 shell 执行基本上不响应 SIGHUP 信号,因此您的命令在从第一个 shell 注销后仍将运行。
关于linux - 谁做守护进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738507/