ps 里一堆 Z 状态进程,kill 也杀不掉:僵尸进程到底是什么
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 的,不用管。
- 点赞
- 收藏
- 关注作者
评论(0)