在 Ubuntu(以及所有 Linux 系统)中,**僵尸进程(Zombie Process)**的本质是:
子进程已经结束,但父进程还没有调用
wait()回收它的状态信息。
僵尸进程不占用 CPU、内存等资源,但会占用一个 PID,如果数量太多,可能导致无法创建新进程。
ps aux | grep Z
或者更直观:
ps -eo pid,ppid,stat,cmd | grep Z
僵尸进程的状态是:
Z
示例:
1001 800 Z [test] <defunct>
❌ 不能
kill -9 僵尸进程PID
无效,因为:
kill 只能作用于“活进程”ps -eo pid,ppid,stat,cmd | grep Z
例如:
1001 800 Z [test] <defunct>
说明:
kill 800
或:
kill -9 800
父进程退出后:
wait()如果你是程序作者,父进程应调用:
wait()
waitpid()
或忽略 SIGCHLD:
signal(SIGCHLD, SIG_IGN);
常见情况:
| 父进程 | 处理方式 |
|---|---|
| systemd | systemctl restart 服务名 |
| docker | docker restart 容器 |
| java | 重启 JVM |
| python | 修复 multiprocessing / subprocess |
| shell 脚本 | 检查是否 wait |
如果父进程是 1:
ps -eo pid,ppid,stat,cmd | grep Z
僵尸进程仍然存在,说明:
✅ 解决方式:
kill -9 父进程
⚠️ 可能导致服务中断,仅用于应急。
while (waitpid(-1, NULL, WNOHANG) > 0);
fork();
fork();
(command &)
或:
wait
僵尸进程杀不掉,只能让父进程处理或退出。
如果你愿意,可以把:
ps -eo pid,ppid,stat,cmd | grep Z 的输出发给我,我可以帮你具体分析 ✅