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
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》重啟