标准答案

  1. 僵尸进程已经结束,只保留退出状态供父进程读取;父进程调用 wait、waitpid 或正确处理 SIGCHLD 后内核才会回收记录。
  2. 孤儿进程仍可能在运行,只是父进程变为 init 或子收割者,由新的父进程负责回收。
  3. 排查应查看 PPID、状态字段和父进程的子进程管理逻辑,不能把所有 PPID 为 1 的进程都当成僵尸。
  4. 服务应明确负责子进程回收,设置 SIGCHLD 处理或使用成熟的 supervisor,避免短任务大量退出后积累。

题目解析

子进程退出后,内核会保留退出码等少量信息,直到父进程调用 wait/waitpid 回收,这个“已退出但未回收”的条目就是僵尸。它不再执行,给僵尸发送 kill 没有作用;真正要修的是父进程的 wait 逻辑、SIGCHLD 处理或子进程管理库。

孤儿进程是父进程先退出、仍在运行的子进程,通常会被 PID 1 或 subreaper 接管,之后仍可正常结束并被回收。排查时要看 PPID、进程状态、父进程日志和子进程创建峰值,避免把孤儿和僵尸混为一谈。

常见误区

  • 误区:反复对僵尸进程发送 kill。改正:让父进程调用 wait,或在确认业务影响后终止父进程使其被重新托管。
  • 误区:把孤儿进程当成僵尸。改正:孤儿仍在运行,僵尸已经退出但退出信息未被父进程回收。

作者信息