D
(Uninterruptible sleep) 状态进程是不可中断的等待资源的进程,也就是说这个状态的进程不处理任何来自kill命令的信号,即使kill -9来了,这个状态的进程还是不搭理的。
现在是我从找到的一个可以杀死这种进程的kernel模块,这是源码kill_d.c
-
#include <linux/init.h>
-
#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);
这是处于同目录下的Makefile
编译:
-
make -C thekerneltree M=`pwd` modules
插入模块时,指定进程号,即可杀死该进程,记得用完后使用rmmod卸载掉改模块:
-
./insmod ./killd.ko pid=1234
这里只是提出了一种思路,抛砖引玉,在生产环境下使用时请自行验证和完善。
参考:http://blog.csdn.net/chinalinuxzend/article/details/4288791
阅读(3690) | 评论(0) | 转发(0) |