
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 [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] <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》重启一个进程对kill -9不响应我知道的有两种情况
未接受到信号或者没有得到分配的时间来完成自己退出所需要的步骤,因为你的CPU100%这个市可能的,多等一些时间应该会自动中止
进程处于IO等待中这时候屏蔽了信号接收自然不会对KILL作出响应,除非IO的请求得到响应,要判断这种情况你可以看 ps aux|grep vi看看进程状态, 如果是 D 那就是了,这个情乱会麻烦一点因为它需要请求的IO得到满足或者被拒绝,而系统没有给与明确的答复他就一直干等着,根据你的描述你需要看这个打开的文件的情况,如果是nfs,那么建议在添加挂载选项为 bg,hard,intr避免这个问题的重现,如果是本地文件你需要察看硬盘或者存储阵列卡是否有问题但是要杀死这个进程却需要重启来解决
评论列表(0条)