- 论坛徽章:
- 0
|
如何杀掉D状态的进程?
基本想法就是修改内核,遍历进程列表,找到处于D状态的进程,将其状态转换为别的状态就可以kill 掉了。
这是一种比较粗鲁的方法,可能会引起一些不良后果,暂时没有考虑。对于确切知道已经没有什么用处,不用做清理工作的,处于D状态怎么也杀不死的进程来说,确是很有效。
内核模块代码:
----------------killd.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------------
obj-m := killd.o
编译模块
make -C yourkerneltree M=`pwd` modules
插入模块的时候提供D状态的进程号,就可以将其转换为stopped状态,使用普通kill就可以杀死。
./insmod ./killd.ko pid=1234 |
|