1. 程式人生 > >linux kill -9 殺不掉的程序

linux kill -9 殺不掉的程序

kill -9 傳送SIGKILL訊號給程序,將其終止,但對於以下兩種情況不適用

1.該程序是殭屍程序(STAT z),此時程序已經釋放所有的資源,但是沒有被父程序釋放。殭屍程序要等到父程序結束,或者重啟系統才可以被釋放。

2.程序處於“核心態”,並且在等待不可獲得的資源,處於“核心態 ”的資源預設忽略所有訊號。只能重啟系統。

kill 只能殺死處於使用者狀態的程序。

下面是一個自測試例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>


int main(int argc ,char *argv[])
{
    pid_t pid;

    pid = fork();
    if(pid<0){
        perror("fork");
        return -1;
    }else if(pid==0){
        printf("I am a child\n");
        exit(0);
    }else{
        while(1){
            sleep(100);
        }
    }
    return 0;
}

由於父程序沒有退出,所以執行ps -aux | grep "z",可以檢視程序的狀態,發現如下(綠色標出部分)

root       1937  0.0  0.1 389000  4336 ?        Sl   09:12   0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
root       4447  0.0  0.0 112680   964 pts/2    R+   10:16   0:00 grep --color=auto z
[[email protected] linux_test]# ps -aux | grep "[zZ]"
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 128164  6828 ?        Ss   09:07   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root       1937  0.0  0.1 389000  4336 ?        Sl   09:12   0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
root       4385

 0.0  0.0      0     0 pts/0    Z+   10:16   0:00 [a.out] <defunct>
root       4455  0.0  0.0 112680   976 pts/2    S+   10:17   0:00 grep --color=auto [zZ]

從以上資訊 可以得到該程序的程序號是4385

此時的解決方法有兩種

《1》 cat /proc/4385/status   找到該子程序對應的父程序,將其父程序殺死

State:Z (zombie)
Tgid:4385
Ngid:0
Pid:4385
PPid:4384

執行kill -9 4384   如果父程序也殺不死,那就只能執行重啟了

《2》重啟