温馨提示×

centos僵尸进程修复技巧

小樊
52
2025-08-10 19:06:41
栏目: 智能运维

一、检测僵尸进程

  • 命令查看
    ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]'
    top 命令查看 zombie 列。

二、修复僵尸进程

  1. 终止父进程(推荐)
    找到僵尸进程的父进程PID,执行 kill -9 父进程PID,僵尸进程会被 init 进程(PID=1)接管并清理。
    注意:优先尝试正常终止(如 kill 不加 -9),避免数据丢失

  2. 手动清理(特殊情况)
    若父进程已终止但僵尸仍存在,可尝试 kill -9 僵尸进程PID,但可能无法彻底解决。

  3. 信号处理
    向父进程发送 SIGCHLD 信号,强制其回收子进程:
    kill -SIGCHLD 父进程PID

  4. 重启父进程
    若父进程为服务,可通过 systemctl restart 服务名 重启,清理所有子进程。

三、预防措施

  • 父进程正确处理子进程
    在代码中调用 wait()waitpid() 回收子进程资源。
    设置信号处理函数捕获 SIGCHLD,自动调用回收函数。

  • 避免忽略信号
    勿在父进程中忽略 SIGCHLD 信号(如 signal(SIGCHLD, SIG_IGN)),可能导致僵尸积累。

  • 定期监控
    通过 cron 定时任务运行检测脚本,自动清理僵尸进程。
    示例脚本:

    #!/bin/bash
    zombies=$(ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | wc -l)
    if [ $zombies -gt 0 ]; then
        echo "$(date) 发现 $zombies 个僵尸,开始清理" >> /var/log/zombie.log
        ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -HUP
    fi
    

四、注意事项

  • 操作前确认进程状态,避免误杀关键进程。
  • 大量僵尸进程可能由程序缺陷导致,需排查代码逻辑。

0