在 CentOS(其实所有 Linux 都一样)里,僵尸进程(Zombie Process)并不是一个“中邪”的东西,而是 Linux 进程机制里的一种正常但需要注意的状态。
简单说:
僵尸进程 = 已经死掉的进程,但还没被父进程“收尸”
当一个进程:
wait() / waitpid() 来回收它这时候,这个进程就变成:
状态显示为:
STAT = Z
ps 看ps -ef | grep defunct
或
ps aux | awk '$8 ~ /Z/'
top
右上角会显示:
Tasks: 120 total, 1 zombie
✅ 少量僵尸进程:基本无害
❌ 大量僵尸进程:有问题
危害包括:
常见原因:
fork();
// 子进程 exit
// 父进程忘了 wait()
init(PID 1)接管就可能堆积
⚠️ 重点:你不能直接 kill 僵尸进程
kill -9 僵尸PID # 没用
ps -o ppid= -p 僵尸PID
kill -9 父PID
父进程死了,僵尸会被 init 接管并清理
systemctl restart xxx
signal(SIGCHLD, SIG_IGN);
或
waitpid(-1, NULL, WNOHANG);
Runtime.exec()&僵尸进程不是病毒,是“爹不收尸”的进程
少量没事,一堆就查父进程
如果你愿意,可以把 ps 输出贴出来,我帮你直接看是哪个服务在“养僵尸”。