Linux环境下如何杀死僵尸进程

我们在使用top命令查看主机性能的的时候会在第二行会查看到有zombie关键字,此关键字代表僵尸进程的意思。

僵尸进程:当进程退出时,它向父进程发送一个SIGCHLD信号,默认情况下总是忽略SIGCHLD信号,此时进程状态一直保留在内存中,直到父进程使用wait函数收集状态信息,才会清空这些信息.用wait来等待一个子进程终止运行称为回收进程。当父进程忘了用wait()函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸进程。

      当用ps命令观察进程的执行状态时,看到这些进程的状态栏为defunct。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。

      但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。

Tasks: 337 total,   1 running, 327 sleeping,   0 stopped,   9 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 54.3%id, 45.7%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:     64417M total,    42611M used,    21806M free,    10924M buffers
Swap:    32764M total,      684M used,    32080M free,    28841M cached


  PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND                                                                                       
 9563 root      20   0  9040 1312  820 R      0  0.0   0:00.19 top                                                                                           
15216 root      20   0     0    0    0 S      0  0.0   5:45.61 kworker/22:1                                                                                  
    1 root      20   0 10528  724  692 S      0  0.0   2:47.29 init                                                                                          
    2 root      20   0     0    0    0 S      0  0.0   0:16.94 kthreadd                                                                                      
    3 root      20   0     0    0    0 S      0  0.0   9:13.20 ksoftirqd/0                                                                                   
    6 root      RT   0     0    0    0 S      0  0.0  94846:34 migration/0                                                                                   
    7 root      RT   0     0    0    0 S      0  0.0  28:43.60 watchdog/0                                                                                    
    8 root      RT   0     0    0    0 S      0  0.0  94692:52 migration/1                                                                                   
   10 root      20   0     0    0    0 S      0  0.0  10:14.96 ksoftirqd/1                                                                                   
   12 root      RT   0     0    0    0 S      0  0.0  28:04.19 watchdog/1                                                                                    
   13 root      RT   0     0    0    0 S      0  0.0  97616:33 migration/2                                                                                   
   15 root      20   0     0    0    0 S      0  0.0   8:06.82 ksoftirqd/2                                                                                   
   16 root      RT   0     0    0    0 S      0  0.0  29:00.53 watchdog/2                                                                                    
   17 root      RT   0     0    0    0 S      0  0.0  78911:26 migration/3


      查看系统状态下的僵尸进程: ps -ef | grep defunct  后面尖括号里是defunct的都是僵尸进程。 在查看僵尸进程时,第三列就是父进程的pid,想要结束僵尸进程,只需kill掉父进程即可。或者使用:ps aux | grep -w 'Z' 其中状态为Z的代表僵尸进程。


你可能感兴趣的:(Linux,运维工作笔记)