在 CentOS 系统中,僵尸进程(Zombie Processes)通常是由于子进程已经结束但其父进程没有正确回收其资源而产生的。要自动清理这些僵尸进程,可以通过编写一个脚本来定期检测和终止这些进程。以下是一个示例脚本,它可以帮助你实现这一目标:
#!/bin/bash
# 定义一个函数来清理僵尸进程
cleanup_zombie_processes() {
# 获取所有僵尸进程的 PID 和 PPID
ps -eo pid,ppid,state,cmd --no-headers | awk '$3 == "Z"' | while read pid ppid cmd; do
echo "Cleaning up zombie process with PID $pid and PPID $ppid"
# 尝试获取僵尸进程的父进程名称
parent_name=$(ps -p $ppid -o comm=)
# 发送 SIGCHLD 信号给父进程,通知其回收子进程资源
kill -s SIGCHLD $ppid
# 如果父进程没有正确回收资源,可以尝试终止父进程
if ps -p $ppid > /dev/null; then
echo "Parent process $parent_name (PID $ppid) did not clean up the zombie process. Terminating it."
kill -s SIGKILL $ppid
else
echo "Parent process $parent_name (PID $ppid) has been terminated."
fi
done
}
# 定期运行清理函数
while true; do
cleanup_zombie_processes
# 每隔 60 秒检查一次
sleep 60
done
保存脚本:
将上述脚本保存到一个文件中,例如 cleanup_zombies.sh。
赋予执行权限:
chmod +x cleanup_zombies.sh
运行脚本: 你可以手动运行脚本,或者将其设置为系统服务以便在后台持续运行。
./cleanup_zombies.sh
如果你希望脚本在系统启动时自动运行,可以将其设置为 systemd 服务。
创建 systemd 服务文件:
创建一个新的 systemd 服务文件,例如 /etc/systemd/system/cleanup_zombies.service。
[Unit]
Description=Cleanup Zombie Processes
After=network.target
[Service]
ExecStart=/path/to/cleanup_zombies.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target
重新加载 systemd 配置:
systemctl daemon-reload
启动服务:
systemctl start cleanup_zombies.service
设置开机自启动:
systemctl enable cleanup_zombies.service
通过以上步骤,你可以确保你的 CentOS 系统定期自动清理僵尸进程,从而保持系统的健康运行。