Linux 把進程為D(不可中斷進程)轉換成其他狀態


問題現象:當前集群跑hadoop的時候,,任務失敗,但是跑任務的容器沒有正常退出,顯示一大堆的YarcChild進程,,more /proc/進程/status   查看其狀態,進程為D(disk sleep),當使用ps  查看所有D進程狀態的時候,執行ps這個命令的進程也變成了D狀態,,尬的一批。所謂D狀態就是不可中斷的狀態,處於該狀態下的進程不接受任何發給他的信號,通常導致該情況產生的原因是由於長時間等待IO導致的,一般的處理方法是reboot,但是生成環境服務器,還是大量的機器有處於D狀態的進程,,進行reboot是不可取的。

 

1、在Linux下創建一個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);

  

2、同路徑下創建Makefile文件,內容如下:

obj-m := killd.o
all :
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules    //最前面的空格必須是tab鍵生產,否則編譯產生錯誤Makefile:3: *** missing separator.  Stop.

clean:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

  

3、在當前目錄下執行make

執行報錯,如下:

make -C /lib/modules/3.10.0-957.5.1.el7.x86_64/build M=/data1/c-make modules
make: *** /lib/modules/3.10.0-957.5.1.el7.x86_64/build: No such file or directory.  Stop.
make: *** [all] Error 2

 

提示沒有文件

4、進入/usr/src/kernels/下看有沒有相應的內核開發包,沒有,就安裝,若有跳過第一步

UNAME=$(uname -r)
yum install gcc kernel-devel-${UNAME%.*}

正常情況下安裝完成以后就可以正常編譯了,如果不行,創建軟連接

ln -s /usr/src/kernels/3.10.0-957.5.1.el7.x86_64/ /lib/modules/3.10.0-957.5.1.el7.x86_64/build/

 

5、插入模塊的時候提供D狀態的進程號,就可以將其轉換為t狀態,使用普通kill就可以殺死。

sudo insmod ./killd.ko pid=1234

 

 

 

 

借鑒:

https://blog.csdn.net/u012343297/article/details/79141878

https://blog.csdn.net/VincentLuo91/article/details/72625446

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM