僵尸进程指已经终止运行、但其退出状态尚未被父进程回收的进程。它不再占用 CPU 和内存,只在内核进程表中保留一条记录。大量僵尸进程堆积会耗尽进程号资源,通常源于父进程未正确调用 wait 回收子进程。

| 所属领域 | 进程管理 |
| 状态标记 | Z(defunct) |
| 产生原因 | 父进程未调用 wait 回收 |
| 清除方式 | 父进程回收或退出 |
| 相关信号 | SIGCHLD |
僵尸进程(Zombie Process)是类 Unix 操作系统中一种特殊的进程状态:进程本身已经执行完毕并退出,但由于父进程尚未读取它的退出状态,内核仍需在进程表中为其保留一条记录。在 ps 命令的输出中,这类进程的状态标记为 Z,名称后常附有 defunct 字样。
在 Linux 等系统中,子进程退出时并不会立即从系统中彻底消失。内核会保留它的进程号、退出码、CPU 使用统计等少量信息,等待父进程通过 wait 或 waitpid 系统调用来读取,这一设计保证了父进程总有机会知道子进程的结局。如果父进程一直不调用 wait,这条记录就会一直存在,进程便成为僵尸进程。僵尸进程不占用内存页和 CPU 时间,无法被 kill 命令杀死,因为它本来就已经死亡,能消除它的唯一方式是让父进程完成回收,或让父进程退出。
单个僵尸进程几乎无害,但若服务端程序频繁创建子进程又从不回收,僵尸进程会不断累积,最终耗尽系统的进程号上限,导致无法创建新进程。排查时可用 ps 命令过滤状态为 Z 的进程,找到其父进程号,修复父进程代码或将其重启;临时手段是杀掉父进程,让 1 号进程接管并完成清理。
问:僵尸进程会占用内存和 CPU 吗?答:基本不会。它的地址空间和大部分资源在退出时已释放,只剩下内核进程表中的一小条记录,主要消耗的是进程号这一有限资源。
问:为什么 kill -9 杀不掉僵尸进程?答:信号只能作用于活着的进程,僵尸进程已经终止,没有任何代码在运行,自然无法响应信号。正确做法是让父进程调用 wait 回收,或结束父进程。
问:僵尸进程和孤儿进程有什么区别?答:僵尸进程是子先死、父未收尸;孤儿进程是父先死、子还活着。孤儿进程会被 1 号进程收养并正常回收,一般不构成问题。

| 所属领域 | 进程管理 |
| 状态标记 | Z(defunct) |
| 产生原因 | 父进程未调用 wait 回收 |
| 清除方式 | 父进程回收或退出 |
| 相关信号 | SIGCHLD |
登录 后参与讨论
暂无讨论,来发表第一条评论吧