有许多技巧来守护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也产生了相同的结果。
答案 0 :(得分:4)
如果进程没有响应SIGHUP信号,您可以守护进程。
当bash shell在运行后台任务时终止时,bash shell会发送SIGHUP (挂断信号)到所有任务。但是bash不会等到子进程完全 终止。如果子进程没有响应SIGHUP信号,那么该进程就变成孤儿 处理。 (它的父pid更改为1 - init进程 - 以防止成为无用的僵尸进程)
子shell执行基本上不响应SIGHUP信号,因此从第一个shell注销后你的命令仍然会运行。