如何殺掉D狀態的進程?[zt]

原貼:http://www.xclinux.cn/?p=752

如何殺掉D狀態的進程?[zt]

       狀態爲 D (Uninterruptible sleep) ,以及狀態爲 Z (Zombie)這些垃圾進程要麼是求而不得,像怨婦一般等待資源(D),要麼是僵而不死,像冤魂一樣等待超度(Z),它們在 CPU run_queue 裏滯留不去,把 Load Average 弄的老高老高,沒看過我前一篇blog的國際友人還以爲這兒民怨沸騰又出了什麼大事呢。怎麼辦?開槍!kill -9!看你們走是不走。但這兩種垃圾進程偏偏是刀槍不入的,不管換哪種槍法都殺不掉它們。無奈,只好reboot,像剿滅禽流感那樣不分青紅皁白地一律撲殺!
       基本想法就是修改內核,遍歷進程列表,找到處於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


相關博文

發佈了75 篇原創文章 · 獲贊 35 · 訪問量 369萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章