红联Linux门户
Linux帮助

linux下如何杀掉D状态进程

发布时间:2017-05-23 09:16:02来源:linux网站作者:晴风的技术博客
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); 
 
然后新建Makefile文件:
obj-m := killd.o 
all :
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
 
然后执行make命令进行编译;
make
 
再执行如下命令:
sudo insmod ./hello.ko #加载
sudo rmmod hello #删除 或者 sudo rmmod ./hello.ko 
 
插入模块的时候提供D状态的进程号,就可以将其转换为t状态,使用普通kill就可以杀死。
sudo insmod ./killd.ko pid=1234
 
本文永久更新地址:http://www.linuxdiyf.com/linux/30991.html