linux运行的时候,偶尔会出现状态为D的进程,使用kill -9 也杀不掉
可以深度以下方法:
1、touch killd.c
#include <linux/init.h>
#include <linux/kernel.h> /*Needed by all modules*/
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/sched/signal.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_current_state(p);
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);
2、touch 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
3、make -C /usr/src/kernels/4.18.0-30503.10.2.el8.aarch64/ M=`pwd` modules
[root@603a08208-9-cebase01 ~]# make -C /usr/src/kernels/4.18.0-30503.10.2.el8.aarch64/ M=`pwd` modules
make: Entering directory '/usr/src/kernels/4.18.0-30503.10.2.el8.aarch64'
CC [M] /root/killd.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/killd.mod.o
LD [M] /root/killd.ko
make: Leaving directory '/usr/src/kernels/4.18.0-30503.10.2.el8.aarch64'
4、插入模块的时候提供D状态的进程号,就可以将其转换为t状态,使用普通kill就可以杀死。
sudo insmod ./killd.ko pid=1234
附件:
版本不同时,缺少set_task_state函数,需要自己做一个.h头文件,然后在.c里include.
touch gaodi.h
#define set_task_state(tsk, state_value) \
do { (tsk)->state = (state_value); } while (0)