在Linux操作系统中,有可能会遇到这么一个问题,就是当你尝试去杀掉一个进程的时候,发现一直kill不掉,再次查看的时候进程还是依然存在。
原因:
在Linux中当你用kill命令向进程发送信号,并不是杀死的意思,-9表示无条件退出,但由进程自行决定是否退出,这就是为什么kill -9 终止不了系统进程和守护进程的原因。
常见的两种kill不掉进程的情况:
1. 进程已经成为僵尸进程(zombie),当它的父进程将它回收或将它的父进程kill掉,ps就看不到这个进程了。可通过top这个指令第二列PPID显示的为父进程。僵尸进程在下次系统重启会消失,但它的存在不会影响系统性能。
2. 进程处于内核态。当进程进入内核态的时候,通常会关闭中断(为了保证内核代码的原子性和可靠性),也会屏蔽所有的信号(防止信号处理程序在内核执行期间被调用,否则会导致不可预期的结果),包括SIGKIL,所以这个时候回使用kill -9发起的信号也一样会被屏蔽。但是信号会被记录在进程的信号挂起队列,进程切换回用户态的时会立即触发信号处理程序。
需要注意的是,进程在内核态执行期间,如果发生了错误或异常,可能会导致进程被强制终止,此时的进程是可以响应kill信号的。