插件窝 干货文章 linux僵尸进程是什么意思

linux僵尸进程是什么意思

进程 僵尸 进程表 状态 653    来源:    2025-05-03

Linux 僵尸进程详解

什么是僵尸进程

僵尸进程(Zombie Process)是指已经终止但其退出状态尚未被父进程读取(通过wait()waitpid()系统调用)的进程。在Linux系统中,这种进程被称为"僵尸"(Zombie)或"defunct"进程。

僵尸进程的特点

  1. 已经终止:进程已经完成了执行,释放了大部分资源
  2. 仍占用进程表项:在进程表中保留一个条目,记录进程的退出状态
  3. 无法被kill:因为进程已经终止,无法通过kill命令杀死
  4. 显示状态为Z:在pstop命令中显示为Zdefunct

僵尸进程的产生原因

僵尸进程通常由以下情况引起:

  1. 父进程没有调用wait()waitpid()来获取子进程的退出状态
  2. 父进程异常终止,未能处理子进程的退出状态
  3. 父进程设计不当,忽略了子进程的退出状态

如何识别僵尸进程

使用以下命令查看僵尸进程:

ps aux | grep 'Z'
# 或者
top # 查看状态为Z的进程

输出示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user     12345  0.0  0.0      0     0 pts/0    Z    10:00   0:00 [process_name] <defunct>

处理僵尸进程的方法

  1. 正确方式:修改父进程代码,使其调用wait()waitpid()
  2. 临时解决方案
    • 终止父进程(僵尸进程会被init进程接管并清理) bash kill -9 父进程PID
  3. 系统重启:极端情况下,重启系统可以清除所有僵尸进程

预防僵尸进程

  1. 在父进程中正确设置信号处理函数(SIGCHLD)
  2. 使用waitpid()非阻塞方式回收子进程
  3. 使用双fork技术(daemon进程常用)
  4. 使用进程组和会话管理

编程建议

在编写会产生子进程的程序时,应该:

// 设置SIGCHLD处理函数
signal(SIGCHLD, sigchld_handler);

void sigchld_handler(int sig) {
    while (waitpid(-1, NULL, WNOHANG) > 0);
}

或者使用更现代的sigaction

struct sigaction sa;
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
    perror("sigaction");
    exit(1);
}

总结

僵尸进程本身不会消耗系统资源(除进程表项外),但大量僵尸进程可能导致进程表耗尽。良好的编程实践可以避免僵尸进程的产生。