我们在使用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的代表僵尸进程。