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

D状态的就是 uninterruptible sleep ,此时进程不能被信号唤醒,GDB等调试工具也不能对它调试,因为GDB也是用到了信号,也杀不死它

D状态的形成

如何分析D状态

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

方法一

重启reboot

方法二 修改内核,将其进程状态转化为别的状态,然后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); 
  3. touch Makefile 文件,写入:

     obj-m := killd.o 
  4. 执行如下命令。生成一堆文件,其中有文件killd.ko。

     # 必须存在内核源码
     make -C /usr/src/kernels/2.6.32-754.23.1.el6.x86_64/ M=`pwd` modules
  5. 找到处于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目录

来源:

https://blog.csdn.net/VincentLuo91/article/details/72625446

上一篇:c – printk是行缓冲的吗?


下一篇:5G NR - CSI-RS学习笔记9 - CSI Reporting的时域行为