4

我制作了一个 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 的命令管道(根据这个主题疯狂的 crond 行为。现在为时已晚,继续制作失效的 bash 进程。父进程在后台运行。

4

2 回答 2

7

做了一些研究之后,看来您必须杀死父进程才能让这些已失效的子进程消失。

链接中最相关的引述说“你不能杀死一个已经死掉的进程(又名僵尸),因为它已经死了。”

于 2013-06-14T14:03:38.513 回答
1

所以正如你所说,你的PHP中的一个命令,比如

$a;
pcntl_waitpid($child_pid, $a, WNOHANG|WUNTRACED);

将完成这项工作。对我来说,很好!

于 2018-10-03T22:29:55.773 回答