我创建了一个PHP脚本,它读取一些数据并使用pctnl_fork启动一个新进程来处理数据。子进程完成后,它们将作为进程保留。 ps aux显示了一个像
这样的过程列表demo 32229 0.0 0.0 0 0 pts/0 Z 12:23 0:00 [php] <defunct>
demo 32251 0.0 0.0 0 0 pts/0 Z 11:50 0:00 [php] <defunct>
demo 32284 0.0 0.0 0 0 pts/0 Z 11:50 0:00 [php] <defunct>
demo 32298 0.0 0.0 0 0 pts/0 Z 12:56 0:00 [php] <defunct>
demo 32303 0.0 0.0 0 0 pts/0 Z 11:50 0:00 [php] <defunct>
demo 32316 0.0 0.0 0 0 pts/0 Z 12:23 0:00 [php] <defunct>
我是否可以安全地终止此进程,因为父进程仍在创建新进程来执行某些工作?我知道我应该启动命令管道到stderr(根据这个主题Insane crond behavior. keeps making defunct bash processes现在已经太晚了。 父进程正在后台运行。
答案 0 :(得分:6)
在doing some research之后,您似乎必须终止这些已解散的子进程的父进程才会消失。
链接中最相关的引用说:“你不能杀死一个已经死亡的已经失效的过程(a.k.a zombie)。”
答案 1 :(得分:1)
所以,正如你所说, PHP中的命令,例如
$a;
pcntl_waitpid($child_pid, $a, WNOHANG|WUNTRACED);
将完成这项工作。 对我来说,还好吧!