Linux中的defunct进程(僵⼫进程)
⼀、什么是defunct进程(僵⼫进程)?
在 Linux 系统中,⼀个进程结束了,但是他的⽗进程没有等待(调⽤wait / waitpid)他,那么他将变成⼀个僵⼫进程。当⽤ps命令观察进程的执⾏状态时,看到这些进程的状态栏为defunct。僵⼫进程是⼀个早已死亡的进程,但在进程表(processs table)中仍占了⼀个位置(slot)。
但是如果该进程的⽗进程已经先结束了,那么该进程就不会变成僵⼫进程。因为每个进程结束的时候,系统都会扫描当前系统中所运⾏的所有进程,看看有没有哪个进程是刚刚结束的这个进程的⼦进程,如果是的话,就由Init进程来接管他,成为他的⽗进程,从⽽保证每个进程都会有⼀个⽗进程。⽽Init 进程会⾃动wait其⼦进程,因此被Init接管的所有进程都不会变成僵⼫进程。
⼆、 Linux下进程的运作⽅式
如果⼦进程先于⽗进程退出, 同时⽗进程⼜没有调⽤wait/waitpid,则该⼦进程将成为僵⼫进程。如果该进程的⽗进程已经先结束了,那么该进程就不会变成僵⼫进程。因为每个进程结束的时候,系统都会扫描当前系统中所运⾏的所有进程,看看有没有哪个 进程是刚刚结束的这个进程的⼦进程,如果是的话,就由Init进程来接管他,成为他的⽗进程,从⽽保证每个进程都会有⼀个⽗进程。⽽Init进程会⾃动 wait其⼦进程,因此被Init接管的所有进程都不会变成僵⼫进程。
每个 Linux进程在进程表⾥都有⼀个进⼊点(entry),核⼼进程执⾏该进程时使⽤到的⼀切信息都存储在进⼊点。当⽤ ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调⽤建⽴⼀个新的进程后,核⼼进程就会在进程表中给这个新进程分配⼀个进⼊点,然后将相关信息存储在该进⼊点所对应的进程表内。这些信息中有⼀项是其⽗进程的识别码。
⼦进程的结束和⽗进程的运⾏是⼀个异步过程,即⽗进程永远⽆法预测⼦进程到底什么时候结束。那么会不会因为⽗进程太忙来不及 wait ⼦进程,或者说不知道⼦进程什么时候结束,⽽丢失⼦进程结束时的状态信息呢?
不会。因为 Linux提供了⼀种机制可以保证,只要⽗进程想知道⼦进程结束时的状态信息,就可以得到。这种机制就是:当⼦进程⾛完了⾃⼰的⽣命周期后,它会执⾏exit()系统调⽤,内核释放该进程所有的资源,包括打开的⽂件,占⽤的内存等。但是仍然为其保留⼀定的信息(包括进程号the process ID,退出码exit code,退出状态the terminationstatus of the process,运⾏时间the amount of CPU time taken by the process等),这些数据会⼀直保留到系统将它传递给它的⽗进程为⽌,直到⽗进程通过wait / waitpid来取时才释放。
也就是说,当⼀个进程死亡时,它并不是完全的消失了。进程终⽌,它不再运⾏,但是还有⼀些残留的数据等待⽗进程收回。当⽗进程 fork() ⼀个⼦进程后,它必须⽤ wait() (或者 waitpid())等待⼦进程退出。正是这个 wait() 动作来让⼦进程的残留数据消失。
三、僵⼫进程的危害
如果⽗进程不调⽤wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会⼀直被占⽤,但是系统的进程表容量是有限的,所能使⽤的进程号也是有限的,如果⼤量的产⽣僵⼫进程,将因为没有可⽤的进程号⽽导致系统不能产⽣新的进程。
所以,defunct进程不仅占⽤系统的内存资源,影响系统的性能,⽽且如果其数⽬太多,还会导致系统瘫痪。⽽且,由于调度程序⽆法选中Defunct 进程,所以不能⽤kill命令删除Defunct 进程,惟⼀的⽅法只有重启系统。
四、如何杀死defunct进程
grep命令查看进程
defunct进程是指出错损坏的进程,⽗⼦进程之间不会再通信。有时,它们会演变成“僵⼫进程”,存留在你的系统中,直到系统重启。可以尝试 “kill -9” 命令来清除,但多数时候不管⽤。
为了杀死这些defunct进程,你有两个选择:
1.重启你的计算机
2.继续往下读…
我们先看看系统中是否存在defunct进程:
$ ps -A|grep defunct
1
输出
5259 ? 00:00:00 sd_cicero <defunct>
12214 pts/18 00:01:14 python <defunct>
16989 pts/18 00:04:43 python <defunct>
20610 pts/18 00:23:12 python <defunct>
看看这些进程的ID及其⽗进程ID:
$ ps -ef | grep defunct | more
UID PID PPID ...
==========================================================================
yourname 4653 6128 0 17:07 pts/18 00:00:00 grep --color=auto defunct
yourname 5259 5258 0 15:58 ? 00:00:00 [sd_cicero] <defunct>
yourname 12214 12211 4 16:41 pts/18 00:01:14 [python] <defunct>
yourname 16989 16986 20 16:45 pts/18 00:04:43 [python] <defunct>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。