温馨提示×

centos僵尸进程常见问题

小樊
50
2025-08-10 19:12:39
栏目: 智能运维

一、产生原因

  1. 父进程未处理子进程退出:子进程结束后,父进程未调用 wait()waitpid() 回收资源。
  2. 忽略 SIGCHLD 信号:父进程未注册信号处理函数,导致无法感知子进程终止。
  3. 父进程提前终止:父进程先于子进程结束,子进程变为孤儿进程,若未被 init 进程及时回收。

二、影响

  • 资源占用:占用进程表条目,可能导致进程表耗尽,影响系统性能。
  • 管理困难:干扰进程状态监控,增加故障排查复杂度。

三、排查方法

  • 命令查看
    • ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]':列出僵尸进程及其父进程。
    • top 命令:查看 zombie 列(部分版本支持)。
  • 定位父进程:通过 ps -o ppid= -p <僵尸进程PID> 获取父进程 ID。

四、清理方法

  1. 终止父进程kill -9 <父进程PID>,僵尸进程会被 init 进程回收。
  2. 手动回收(需权限)kill -SIGCHLD <父进程PID>,强制父进程处理子进程退出。
  3. 批量清理:通过脚本结合 psxargs 批量终止父进程。

五、预防措施

  • 父进程正确处理信号:注册 SIGCHLD 信号处理函数,调用 waitpid() 回收子进程。
  • 使用 nohup&:避免父进程阻塞,由 init 进程管理子进程。
  • 限制子进程数量:避免创建过多子进程,减少僵尸进程风险。

0