kill -9 发送sigkill信号给进程,将其终止,但对于以下两种情况不适用
1.该进程是僵尸进程(stat z),此时进程已经释放所有的资源,但是没有被父进程释放。僵尸进程要等到父进程结束,或者重启系统才可以被释放。
2.进程处于“核心态”,并且在等待不可获得的资源,处于“核心态 ”的资源默认忽略所有信号。只能重启系统。
kill 只能杀死处于用户状态的进程。
下面是一个自测试例子:
#include
#include
#include
#include
#include
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
[root@localhost 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]
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》重启