【问题标题】:Can I delete [php] <defunct> processes我可以删除 [php] <defunct> 进程吗
【发布时间】:2024-04-11 16:05:03
【问题描述】:

我制作了一个 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 现在为时已晚。 父进程在后台运行。

【问题讨论】:

    标签: linux process kill-process


    【解决方案1】:

    正如你所说, PHP 中的命令,例如

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

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

    【讨论】:

      【解决方案2】:

      doing some research 之后,看来您必须终止父进程才能让这些已失效的子进程消失。

      链接中最相关的引述是“你不能杀死一个已经死掉的进程(也就是僵尸)。”

      【讨论】:

      • 补充一点,僵尸进程之所以存在,是为了让父进程可以收集它们的退出状态。如果父母从不检查,他们会一直待到父母退出。
      • 所以我假设如果父母不关心退出状态,那么杀死这个进程是安全的。
      • 父进程,是的。子进程本身不能在没有父进程被杀死的情况下被杀死,因为它们已经是死进程(因此它们已经失效)。