在 Ubuntu(以及所有 Linux 系统)中,僵尸进程(Zombie Process)不会自动消失,除非它的父进程回收它。下面详细解释一下。
僵尸进程是:
ps 中显示为 Z 状态(zombie)它不占用 CPU、不执行代码,但:
如果父进程调用了 wait() / waitpid(),僵尸进程会立刻消失。
✅ 这是正常情况
如果父进程:
SIGCHLD那么:
僵尸进程会一直存在,直到父进程退出
❌ 不会自动消失
当父进程退出后:
wait() 子进程✅ 这是“间接自动消失”的一种情况
ps aux | grep Z
或:
ps -eo pid,ppid,stat,cmd | grep Z
看到 STAT=Z 就是僵尸进程。
⚠️ 你不能直接 kill 一个僵尸进程
kill -9 <zombie_pid> # ❌ 没用
kill <父进程PID>
父进程退出后,僵尸会被 systemd 回收。
waitpid(-1, NULL, WNOHANG);
或处理 SIGCHLD 信号。
如果是服务产生的僵尸:
systemctl restart 服务名
少量僵尸进程:
大量僵尸进程:
cat /proc/sys/kernel/pid_max
僵尸进程不会自动消失,除非父进程回收或父进程退出后被 init 接管。
如果你愿意,可以把 ps 输出贴出来,我可以帮你判断该不该处理、怎么处理最安全。