1 前言
Zombie : 僵死进程
1.1 什么是僵尸进程?
我们都知道进程的工作原理。
我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。 进程停止后, 该进程就会从进程表中移除。
但是,有时候有些程序即使执行完了也依然留在进程表中。
那么,这些完成了生命周期但却依然留在进程表中的进程,我们称之为 僵尸进程
。
1.2 僵尸进程如何产生的?
当你运行一个程序时,它会产生一个父进程以及很多子进程。 所有这些子进程都会消耗内核分配给它们的内存和 CPU 资源。
这些子进程完成执行后会发送一个 Exit 信号然后死掉。这个 Exit 信号需要被父进程所读取。父进程需要随后调用 wait 命令来读取子进程的退出状态,并将子进程从进程表中移除。
若父进程正确第读取了子进程的 Exit 信号,则子进程会从进程表中删掉。
但若父进程未能读取到子进程的 Exit 信号,则这个子进程虽然完成执行处于死亡的状态,但也不会从进程表中删掉。
1.3 僵尸进程对系统有害吗?
由于僵尸进程并不做任何事情, 不会使用任何资源也不会影响其它进程, 因此存在僵尸进程也没什么坏处。
但是,由于进程表中的退出状态以及其它一些进程信息也是存储在内存中的,因此存在太多僵尸进程有时也会是一些问题。
2 查找以及结束僵死进程
2.1 查找僵死进程
首先,可以使用top
命令查看当前是否有Zombie
(僵死)进程:
也可以用 ps -aux |grep Z
命令 来查看僵尸进程,
可以看到僵尸进程数,1 zombie
,1 代表系统存在一个僵尸进程,
最后,利用ps
命令查找Zombie进程(僵尸进程的状态显示的是Z),
ps -A -ostat,ppid,pid,cmd | grep -e '^[zZ]'
如下结果:
xxx@xxx-NB50TJ1-TK1:~$ ps -A -ostat,ppid,pid,cmd | grep -e '^[zZ]'
Z+ 70837 70912 [fcitx] <defunct>
xxx@xxx-NB50TJ1-TK1:~$ ^C
70912 是僵死进程ID,70837 就是 它的父进程ID,只要杀死它的父亲进程就可以结束僵死进程了
2.2 结束Zombie进程
直接kill -9 Zombiepid是没有作用的;
原因:Zombie表示进程已经退出,想要清理这样的进程,需要清除其父进程或者等很长时间后内核将其清除
kill -HUP ppid(父进程ID)
这样父进程就会删除所有完成并死掉的子进程了