Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84751
  • 博文数量: 7
  • 博客积分: 1498
  • 博客等级: 上尉
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-01 17:47
文章分类

全部博文(7)

文章存档

2016年(3)

2009年(1)

2007年(3)

我的朋友

分类: LINUX

2016-10-24 22:22:43

    D(Uninterruptible sleep) 状态进程是不可中断的等待资源的进程,也就是说这个状态的进程不处理任何来自kill命令的信号,即使kill -9来了,这个状态的进程还是不搭理的。
   现在是我从找到的一个可以杀死这种进程的kernel模块,这是源码kill_d.c

点击(此处)折叠或打开

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/sched.h> //for_each_process
  4. MODULE_LICENSE("BSD");
  5. static int pid = -1;
  6. module_param(pid, int, S_IRUGO);
  7. static int killd_init(void)
  8. {
  9.     struct task_struct * p;
  10.     printk(KERN_ALERT "killd: force D status process to death/n");
  11.     printk(KERN_ALERT "killd: pid=%d/n", pid);
  12.     //read_lock(&tasklist_lock);
  13.     for_each_process(p){
  14.         if(p->pid == pid){
  15.             printk("killd: found/n");
  16.             set_task_state(p, TASK_STOPPED);
  17.             printk(KERN_ALERT "killd: aha, dead already/n");
  18.             return 0;
  19.         }
  20.     }
  21.     printk("not found");
  22.     //read_unlock(&tasklist_lock);
  23.     return 0;
  24. }
  25. static void killd_exit(void)
  26. {
  27.     printk(KERN_ALERT "killd: bye/n");
  28. }
  29. module_init(killd_init);
  30. module_exit(killd_exit);
这是处于同目录下的Makefile

点击(此处)折叠或打开

  1. obj-m := kill_d.o
编译:

点击(此处)折叠或打开

  1. make -C thekerneltree M=`pwd` modules
插入模块时,指定进程号,即可杀死该进程,记得用完后使用rmmod卸载掉改模块:

点击(此处)折叠或打开

  1. ./insmod ./killd.ko pid=1234

这里只是提出了一种思路,抛砖引玉,在生产环境下使用时请自行验证和完善。

参考:http://blog.csdn.net/chinalinuxzend/article/details/4288791
阅读(3690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~