ps 里一堆 Z 状态进程,kill 也杀不掉:僵尸进程到底是什么

举报
yd_241984912 发表于 2026/11/05 22:09:24 2026/11/05
【摘要】 ps aux 一看,STAT 那一列冒出一堆 Z,kill -9 过去也没用,进程还赖在表里。第一反应往往是进程卡死了,其实不是,Z 不是卡死,是已经死了。进程退出后,内核不会立刻把它清掉,而是留一个进程表项,存着退出码和资源使用统计,等父进程来收,这个收的动作叫 wait。父进程还没调用 wait 之前,退出的子进程就处在 Z 状态,也就是僵尸进程。它已经不跑了,不占 CPU、不占内存,只...

ps aux 一看,STAT 那一列冒出一堆 Z,kill -9 过去也没用,进程还赖在表里。第一反应往往是进程卡死了,其实不是,Z 不是卡死,是已经死了。

进程退出后,内核不会立刻把它清掉,而是留一个进程表项,存着退出码和资源使用统计,等父进程来收,这个收的动作叫 wait。父进程还没调用 wait 之前,退出的子进程就处在 Z 状态,也就是僵尸进程。它已经不跑了,不占 CPU、不占内存,只占一个表项。所以僵尸本身不可怕,可怕的是父进程一直不来收。

先确认是谁的孩子:ps -o pid,ppid,stat,cmd -p 进程号能看到 Z 进程的 PPID,顺着 PPID 找到父进程;ps aux | awk '$8 ~ /Z/' 能把所有僵尸一次列出来。如果父进程已经是 1 号,也就是 systemd,说明原来的父进程死了、孩子被过继了,systemd 会定期收掉,不用管。

处理要找父进程,不是杀僵尸:僵尸已经死了,kill 对它没用。如果父进程是自己写的服务,修它的 wait 逻辑,让它调用 waitpid 或者正确处理 SIGCHLD;如果父进程已经卡死或者不再需要,重启父进程,僵尸会被 init 接管并收掉。不要为了清几个僵尸重启整台机器;只有僵尸数量失控、比如几千上万个,才说明父进程有 bug 或者父进程死了没被接管,那时再处理父进程。

一句话总结:僵尸进程不是卡死的进程,是等父进程收尸的已退出进程;杀僵尸没用,找父进程才是正解;父进程是 systemd 的,不用管。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。