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);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

4、插入模块的时候提供D状态的进程号,就可以将其转换为t状态,使用普通kill就可以杀死。

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

附件:

版本不同时,缺少set_task_state函数,需要自己做一个.h头文件,然后在.c里include.

touch gaodi.h

#define set_task_state(tsk, state_value)                \

       do { (tsk)->state = (state_value); } while (0)