在 Debian(以及所有 Linux 系统)中,僵尸进程(Zombie / defunct)本身是不能直接 kill 掉的,因为它已经结束了,只是还在进程表里占个位置,等父进程来“收尸”。
正确做法不是杀僵尸,而是处理它的父进程。
ps -l
或
ps -ef | grep defunct
如果 STAT 是 Z,就是僵尸进程。
ps -o pid,ppid,stat,cmd -C <僵尸进程名>
或
ps -l <僵尸PID>
看 PPID(父进程 ID)
如果父进程是正常服务:
kill -CHLD <父进程PID>
或重启父进程对应的服务:
systemctl restart 服务名
如果父进程不重要或已异常:
kill <父进程PID>
还不行就:
kill -9 <父进程PID>
父进程死后,僵尸会被 init(PID 1)接管并自动清理。
kill -9 僵尸PID # 无效
僵尸已经死了,kill 不了。
通常是父进程有 bug(比如不断 fork 不 wait)
解决思路:
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
如果你愿意,可以把:
ps -ef | grep defunct
和
ps -o pid,ppid,cmd -p <父PID>
的输出贴出来,我可以帮你判断该杀哪个、能不能杀。