Debian僵尸进程防范与处置
一 核心原理与预防要点
二 快速识别与定位
ps -eo pid,ppid,state,cmd | awk '$3 ~ /Z/ {print}' 查看状态为 Z 的进程。pstree -p 树形展示父子关系,便于定位僵尸的父进程。cat /proc/<PID>/status | grep State 查看进程状态是否为 Z。三 处置步骤与注意事项
kill <PPID>;3) 如父进程无响应或属异常卡死,再强制终止:kill -9 <PPID>;4) 父进程被终止后,僵尸会被 PID 1 收养并回收;5) 若属于某服务,优先重启该服务以恢复业务。四 最小可复现实例与最佳实践
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void sigchld_handler(int signo) {
int status;
pid_t pid;
// 非阻塞回收所有已退出子进程
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
printf("Reaped child %d, exit status: %d\n", pid, WEXITSTATUS(status));
}
}
int main(void) {
struct sigaction sa = {0};
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) { perror("sigaction"); exit(1); }
if (fork() == 0) { execl("/bin/sleep", "sleep", "30", NULL); exit(1); }
while (1) pause(); // 实际服务替换为业务逻辑
}
ps -eo pid,ppid,state,cmd | awk '$3 ~ /Z/ {print}' 并推送告警;发现异常时优先重启对应服务或修复父进程回收逻辑。