在 Debian(以及其他 Linux 发行版)中,**僵尸进程(Zombie / defunct 进程)**是指已经结束执行,但其父进程还没有调用 wait() 回收其退出状态的进程。
下面是查看和处理僵尸进程的常用方法:
ps 命令ps aux | grep ' Z'
或更准确地:
ps -ef | grep ' Z'
僵尸进程在 STAT 列会显示为:
Z:僵尸进程Z+:前台僵尸进程示例:
user 1234 1200 0 10:00 ? 00:00:00 [process] <defunct>
ps aux | awk '$8 ~ /Z/ {print $2}' | wc -l
或:
top
在 top 中查看:
Tasks: 210 total, 1 zombie
htop(推荐)sudo apt install htop
htop
僵尸进程会标记为 Z 或 zombie。
僵尸进程不能直接 kill,需要找它的父进程(PPID)。
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
示例输出:
PID PPID STAT CMD
1234 1000 Z [test] <defunct>
说明:
1234 是僵尸进程1000 是它的父进程如果父进程是正常的:
kill -CHLD 父进程PID
通知父进程处理子进程退出状态。
如果父进程有 bug 或卡死:
kill -TERM 父进程PID
# 或
kill -KILL 父进程PID
父进程退出后,僵尸进程会被 init(PID 1)接管并自动回收。
kill -9 僵尸PID
僵尸进程已经死了,kill 无效
ps -p 1 -o pid,cmd
cat /proc/stat | grep processes
SIGCHLDfork 后未 waitps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
如果你愿意,可以贴出你的 ps 输出,我可以帮你具体分析是哪一个服务或程序导致僵尸进程。