Ubuntu 僵尸进程的根治方案
一 核心原则与成因
二 立即处置步骤
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/ {print}' 或 top/htop 中观察状态列为 Z 的条目。记录僵尸的 PID 与其 PPID(父进程)。kill -s SIGCHLD <PPID>;随后再次检查是否清除。注意:这仅对“父进程存在但漏回收”的情况有效。kill <PPID> 或 systemctl restart <服务名>),使僵尸被 PID 1 收养并回收。必要时再重启相关服务或系统。直接 kill -9 <僵尸PID> 无效。pstree -p 或 ps -p <僵尸PID> -o ppid= 追踪父子关系,快速找到“问题父进程”。三 开发侧彻底预防
sigaction 注册 handler,handler 中 while (waitpid(-1, NULL, WNOHANG) > 0);SA_RESTART 以便被信号中断的系统调用自动重启。signal(SIGCHLD, SIG_IGN);(适用于不需要子进程退出状态的场景)。fork() 产生的子进程”,仍需由父进程 wait/waitpid 回收。四 运维侧长期治理
[Service] ExecStart=... Restart=always(必要时配合 Type=forking 或 Type=notify 等正确类型)。Z_COUNT=$(ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/ {print}' | wc -l),当 Z_COUNT>0 触发处理流程。kill -9 僵尸,或以“杀父进程”作为常规手段;应定位并修复“父进程不回收”的根因,必要时才重启父进程/服务。