linux kill -9 杀不掉的进程

本文探讨了使用kill-9命令终止进程的局限性,特别是在面对僵尸进程和核心态进程时的无效性,并提供了一种通过查找并杀死父进程的方法来解决僵尸进程的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值