D狀態的就是 uninterruptible sleep ,此時進程不能被信號喚醒,GDB等調試工具也不能對它調試,因為GDB也是用到了信號,也殺不死它
cat /proc/17944/status ; echo -e "\n"; cat /proc/17944/stack
方法一
重啟reboot
方法二 修改內核,將其進程狀態轉化為別的狀態,然后kill掉。
-
創建目錄kill_D_process,進入目錄繼續
-
touch 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);
-
touch Makefile 文件,寫入:
obj-m := killd.o
-
執行如下命令。生成一堆文件,其中有文件killd.ko。
# 必須存在內核源碼 make -C /usr/src/kernels/2.6.32-754.23.1.el6.x86_64/ M=`pwd` modules
-
找到處於D狀態的進程,比如pid=1234,執行如下命令,進程狀態變成T(停止狀態),然后使用kill -9 pid殺死
sudo insmod ./killd.ko pid=1234
內核源碼安裝:
yum install kernel
yum install kernel-devel 或者 yum update更新下
其中kernel-devel將內核源代碼安裝到/usr/src/kernels/目錄下
或者
uname -r查看內核版本;下載新內核源碼:到官網www.kernel.org,下載最新版本linux內核,保存到/usr/src/kernels目錄