在 Debian(以及所有 Linux 系统)里,**僵尸进程(Zombie Process)**的本质是:
一个已经结束运行、但其父进程还没有“收尸”(调用
wait()/waitpid())的进程。
当一个进程满足以下条件时,就算僵尸进程:
exit() 或被信号杀死)wait() / waitpid() 来获取子进程退出状态此时,进程表中仍然保留一条记录:
Z(zombie)ps 看ps aux | grep ' Z'
或
ps -ef | grep ' Z'
状态列出现:
STAT=Z
示例:
user 1234 1200 0 10:00 ? 00:00:00 [myapp] <defunct>
<defunct> 就是僵尸。
top在 top 中:
z 高亮S 列,显示为 Zps aux | awk '$8 ~ /Z/ {print}'
或
top -bn1 | grep zombie
wait()fork() 但不 wait()父进程写错了
SIGCHLDwait()父进程卡死 / 死循环
错误使用 signal(SIGCHLD, SIG_IGN)
服务 bug
kill 僵尸kill -9 僵尸PID # 无效
kill -9 父进程PID
然后僵尸会被 init(PID 1)接管并回收。
SIGCHLDwaitpid(-1, &status, WNOHANG)systemctl restart xxx
Debian 中,子进程已死、父进程未回收,状态为
Z,就是僵尸进程。
如果你愿意,可以贴一段 ps 输出,我可以帮你判断是不是真僵尸、谁造成的。