一、预防僵尸进程
- 父进程正确回收子进程
- 在代码中使用
wait()或waitpid()系统调用回收子进程资源。 - 通过信号处理函数捕获
SIGCHLD信号,自动调用回收函数。
- 在代码中使用
- 使用进程管理工具
- 用
systemd管理服务,配置Restart=always确保子进程被正确回收。 - 通过
supervisord监控进程,自动重启异常进程。
- 用
- 合理运行后台进程
- 用
nohup和&运行命令,避免终端关闭导致子进程异常。
- 用
二、检测与处理僵尸进程
- 快速定位僵尸进程
- 用
ps aux | grep 'Z'或top/htop查看状态为Z的进程。 - 通过
pstree或pgrep查找僵尸进程的父进程。
- 用
- 清理僵尸进程
- 终止父进程(谨慎使用
kill -9,可能导致数据丢失)。 - 重启相关服务(如
sudo systemctl restart nginx)。 - 编写定时任务脚本定期扫描并清理(示例脚本见)。
- 终止父进程(谨慎使用
三、系统级优化
- 调整内核参数
- 修改
/etc/sysctl.conf,优化pid_max等参数(需根据系统负载调整)。
- 修改
- 监控与告警
- 用
systemd-cgtop或 Prometheus 监控进程状态,设置异常告警。
- 用
注意:大量僵尸进程可能导致进程表耗尽,影响系统稳定性,需及时处理。优先通过优化父进程逻辑避免产生僵尸进程,而非依赖事后清理。