linux下如何杀掉D状态进程

来源:互联网 发布:java微信接口开发 编辑:程序博客网 时间:2024/05/18 19:43

D状态(disk sleep)进程用kill -9命令是不管用的,最简单的方法就是reboot, 除此还可以修改内核,将其进程状态转化为别的状态,然后kill掉。 
新建文件夹, cd进去,新建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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

然后新建Makefile文件:

obj-m := killd.o all :    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后执行make命令进行编译;

make
  • 1

再执行如下命令:

sudo insmod ./hello.ko #加载sudo rmmod hello #删除 或者 sudo rmmod ./hello.ko 
  • 1
  • 2
  • 3

插入模块的时候提供D状态的进程号,就可以将其转换为t状态,使用普通kill就可以杀死。

sudo insmod ./killd.ko pid=1234
原创粉丝点击