ps aux | grep 'Z'
:筛选状态为Z(僵尸)的进程,显示PID、PPID等信息。top/htop
:实时查看进程状态,标记为Z的即为僵尸进程。pstree -p | grep 'Z'
:以树状结构显示进程关系,便于定位父进程。SIGCHLD
信号,触发其调用waitpid()
回收子进程资源。# 获取僵尸进程的父进程ID(PPID)
ps -o ppid= -p <僵尸进程PID>
# 发送信号
kill -s SIGCHLD <父进程PID>
# 终止父进程(可能导致服务中断,谨慎使用)
kill -9 <父进程PID>
init
进程(PID=1)自动回收,但可能影响依赖该父进程的其他服务。# 重启服务(以Nginx为例)
systemctl restart nginx
# 重载配置
systemctl reload nginx
定时任务脚本
编写脚本定期检测并清理僵尸进程,添加到crontab
中:
# 示例脚本(保存为cleanup_zombies.sh)
#!/bin/bash
for pid in $(ps -eo pid,stat | awk '$2~/^Z/ {print $1}'); do
ppid=$(ps -o ppid= -p $pid)
kill -s SIGCHLD $ppid 2>/dev/null
done
添加定时任务:
crontab -e
# 每5分钟运行一次
*/5 * * * * /path/to/cleanup_zombies.sh
代码级预防
waitpid()
或注册SIGCHLD
信号处理器,主动回收子进程。init
进程接管。kill -9
:强制终止进程可能导致数据丢失或服务异常,优先通过信号通知父进程回收。参考来源: