centos僵尸进程常见问题
小樊
40
2025-08-10 19:12:39
一、产生原因
- 父进程未处理子进程退出:子进程结束后,父进程未调用
wait()
或 waitpid()
回收资源。
- 忽略 SIGCHLD 信号:父进程未注册信号处理函数,导致无法感知子进程终止。
- 父进程提前终止:父进程先于子进程结束,子进程变为孤儿进程,若未被 init 进程及时回收。
二、影响
- 资源占用:占用进程表条目,可能导致进程表耗尽,影响系统性能。
- 管理困难:干扰进程状态监控,增加故障排查复杂度。
三、排查方法
- 命令查看:
ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]'
:列出僵尸进程及其父进程。
top
命令:查看 zombie
列(部分版本支持)。
- 定位父进程:通过
ps -o ppid= -p <僵尸进程PID>
获取父进程 ID。
四、清理方法
- 终止父进程:
kill -9 <父进程PID>
,僵尸进程会被 init 进程回收。
- 手动回收(需权限):
kill -SIGCHLD <父进程PID>
,强制父进程处理子进程退出。
- 批量清理:通过脚本结合
ps
和 xargs
批量终止父进程。
五、预防措施
- 父进程正确处理信号:注册 SIGCHLD 信号处理函数,调用
waitpid()
回收子进程。
- 使用
nohup
或 &
:避免父进程阻塞,由 init 进程管理子进程。
- 限制子进程数量:避免创建过多子进程,减少僵尸进程风险。