如何杀死处于进程状态D的进程

文章介绍了Linux进程处于D状态,即不可中断的睡眠状态时,无法通过信号或GDB进行调试或杀死。主要提供了三种方法来应对这种情况:1)重启系统;2)解决引起IO阻塞的问题;3)通过编写内核模块强制转换进程状态并杀死。文章还详细说明了如何创建和加载内核模块来强制停止D状态的进程。
摘要由CSDN通过智能技术生成

如何杀死处于进程状态D的进程

Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态 ,此时进程不能被信号唤醒,GDB等调试工具也不能对它调试,因为GDB也是用到了信号,也杀不死它

Linux D进程

如何分析D状态

cat /proc/17944/status ; echo -e "\n"; cat /proc/17944/stack

查找D进程

ps -efl |awk '{if($2=="D")print $0}'

方法一

重启reboot

方法二

处于uninterruptible sleep状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO,如果进程正在等待的IO在较长的时间内都没有响应,就会转变成为D进程。此时只要解决引起io阻塞的问题进程状态通常会回归正常。

方法三 修改内核,将其进程状态转化为别的状态,然后kill掉。

  1. 创建目录kill_D_process,进入目录继续

  2. touch killd.c,写入如下内容:

#include <linux/init.h> 
#include <linux/kernel.h> /*Needed by all modules*/
#include <linux/module.h> 
#include <linux/sched.h> //for_each_process 
MODULE_LICENSE("BSD"); 
static int pid = -1; 
module_param(pid, int, S_IRUGO); 
static int killd_init(void) 
{ 
    struct task_struct * p; 
    printk(KERN_ALERT "killd: force D status process to death/n"); 
    printk(KERN_ALERT "killd: pid=%d/n", pid); 
    //read_lock(&tasklist_lock); 
    for_each_process(p){ 
        if(p->pid == pid){ 
            printk("killd: found/n"); 
            set_task_state(p, TASK_STOPPED); 
            printk(KERN_ALERT "killd: aha, dead already/n"); 
            return 0; 
        } 
    } 
    printk("not found"); 
    //read_unlock(&tasklist_lock); 
    return 0; 
} 
static void killd_exit(void) 
{ 
    printk(KERN_ALERT "killd: bye/n"); 
} 
module_init(killd_init); 
module_exit(killd_exit); 
  1. touch Makefile 文件,写入:
 obj-m := killd.o 
  1. 执行如下命令。生成一堆文件,其中有文件killd.ko。
# 必须存在内核源码
make -C /usr/src/kernels/2.6.32-754.23.1.el6.x86_64/ M=`pwd` modules
  1. 找到处于D状态的进程,比如pid=1234,执行如下命令,进程状态变成T(停止状态),然后使用kill -9 pid杀死
sudo insmod ./killd.ko pid=1234

内核源码安装:#

yum install kernel 
yum install kernel-devel 或者 yum update更新下
其中kernel-devel将内核源代码安装到/usr/src/kernels/目录下 

或者
uname -r查看内核版本;下载新内核源码:到官网www.kernel.org,下载最新版本linux内核,保存到/usr/src/kernels目录
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值