在 Ubuntu(以及所有 Linux 系统)中,**僵尸进程(Zombie Process)**的本质原因是:
子进程已经结束,但其父进程还没有调用
wait()/waitpid()来回收子进程的退出状态。
下面从原理、常见原因、如何排查和处理几个方面说明。
Z(Zombie)ps aux | grep Z
或
ps -eo pid,ppid,stat,cmd | grep Z
看到 STAT=Z 就是僵尸进程。
当子进程退出时:
wait() 读取如果父进程:
wait()子进程就会变成僵尸。
✅ 这是僵尸进程的根本原因
init(PID 1)会自动回收孤儿进程wait() 在另一个线程例如:
sleep()SIGSTOP导致无法及时 wait()
其实不是 Ubuntu 的问题,而是:
✅ 一般危害不大
❌ 但:
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
ps -p <僵尸PID> -o ppid=
ps -p <父PID> -o pid,stat,cmd
kill -9 <僵尸PID> # 无效
因为:
僵尸进程已经死了,只是还没“销户”
wait(NULL);
或
waitpid(-1, NULL, WNOHANG);
kill -9 父进程PID
效果:
systemd / init 接管wait(),僵尸消失 ✅⚠️ 注意:可能影响服务
systemctl restart 服务名
或重启系统(不推荐,但有效)
✅ 在父进程中:
wait() / waitpid()SIGCHLD 信号处理signal(SIGCHLD, SIG_IGN);
(让内核自动回收)
✅ 使用 systemd 管理服务,而不是自己 fork
Ubuntu 出现僵尸进程,不是系统问题,而是父进程没有回收子进程退出状态。
如果你愿意,可以把:
ps -eo pid,ppid,stat,cmd贴出来,我可以帮你精确定位是哪个程序的问题。