阅读量:149
一、查看僵尸进程
- 命令行工具
ps aux | grep 'Z':筛选状态为Z(僵尸)的进程,显示PID、父进程ID(PPID)等信息。top/htop:在进程列表中查找状态为Z的进程,htop需安装,界面更直观。pstree -p:以树状结构显示进程关系,标记僵尸进程。
二、清除僵尸进程
1. 优先终止父进程(推荐)
- 若父进程非
init(PID=1),用kill -9 <父进程PID>终止,系统会自动回收僵尸进程。- 示例:
pstree -p <僵尸PID> | grep -oP '\[([\d,]+)\]'提取父进程PID,再执行kill。
- 示例:
2. 强制回收(谨慎使用)
- 向僵尸进程发送
SIGCHLD信号,尝试唤醒父进程回收:
kill -s SIGCHLD <僵尸PID>。 - 若无效,可尝试
kill -9 <僵尸PID>,但可能导致资源未完全释放,仅作为最后手段。
3. 服务级处理
- 若僵尸进程由服务异常产生,重启对应服务:
sudo systemctl restart <服务名>(如Nginx、MySQL)。
三、预防措施
- 编程规范:确保父进程调用
wait()或waitpid()回收子进程资源。 - 信号处理:在父进程中捕获
SIGCHLD信号,自动调用回收函数。 - 定时任务:编写脚本定期检测并清理僵尸进程,通过
crontab设置定时执行。
注意事项
- 避免直接
kill -9僵尸进程,优先处理父进程。 - 若僵尸进程持续产生,需排查程序逻辑或系统配置问题。
参考来源: