在 CentOS(以及其它 Linux 发行版)中,**僵尸进程(Zombie / 僵死进程)**本身已经释放了大部分资源,只保留进程表项等待父进程回收。因此“处理僵尸进程”的核心思路是:让父进程回收它,或在必要时重启/结束父进程。
ps -ef | grep defunct
# 或
ps aux | awk '$8 ~ /Z/'
状态为 Z 或显示 <defunct> 的就是僵尸进程。
ps -ef | grep defunct
示例:
user1 1234 1200 0 10:00 ? 00:00:00 [xxx] <defunct>
其中 1200 是父进程 PID
kill -SIGCHLD 1200
有些程序收到 SIGCHLD 后会 wait() 回收子进程。
systemctl restart 服务名
# 或
kill -TERM 1200
重启父进程后,僵尸进程通常会被 init(PID 1)接管并自动回收。
kill -9 1200
父进程死后,僵尸进程会被 init / systemd 收养并清理。
⚠️ 不能直接 kill PID 1
处理方式:
kill -9 僵尸PID # 无效
因为僵尸进程已经“死”了,只是没被回收。
wait() / waitpid()signal(SIGCHLD, SIG_IGN)fork() + exec() 时正确处理子进程退出CentOS 处理僵尸进程:找父进程 → 让父进程回收 → 不行就重启/杀父进程 → 绝不能 kill 僵尸本身
如果你愿意,可以把 ps -ef 的输出贴出来,我可以帮你具体分析该杀哪个进程。