在 CentOS(以及其它 Linux 发行版)中,排查和处理**僵尸进程(Zombie / defunct 进程)**通常可以按下面几个步骤来做。
僵尸进程是已经结束运行,但其父进程还没有调用 wait() 回收它的进程。
特征:
Z(zombie)killps 查看ps -ef | grep defunct
或
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
toptop
在任务区看:
Tasks: xx total, x zombie
ps aux | awk '$8 ~ /Z/ {print $2}' | wc -l
僵尸进程无法 kill,关键是找父进程(PPID)
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
示例输出:
1234 1000 Z [java] <defunct>
说明:
查看父进程信息:
ps -p 1000 -o pid,ppid,cmd,stat
systemctl restart 服务名
# 或
kill -TERM 父进程PID
父进程退出后,僵尸进程会被
init(PID 1)接管并回收
如果父进程无用或异常:
kill -9 父进程PID
⚠️ 注意:
kill -9 僵尸PID(无效)如果父进程是某个服务:
systemctl status 服务名
journalctl -u 服务名
wait())fork 后未 waitSIGCHLDwaitpid()fork 不回收如果你愿意,可以把 ps 或 top 的输出贴出来,我可以帮你具体分析是哪个进程导致的。