如何殺死處於進程狀態D的進程


如何殺死處於進程狀態D的進程

Linux進程狀態:D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態 ,此時進程不能被信號喚醒,GDB等調試工具也不能對它調試,因為GDB也是用到了信號,也殺不死它

Linux D進程

如何分析D狀態

cat /proc/17944/status ; echo -e "\n"; cat /proc/17944/stack

查找D進程

ps -efl |awk '{if($2=="D")print $0}'

方法一

重啟reboot

方法二

處於uninterruptible sleep狀態的進程通常是在等待IO,比如磁盤IO,網絡IO,其他外設IO,如果進程正在等待的IO在較長的時間內都沒有響應,就會轉變成為D進程。此時只要解決引起io阻塞的問題進程狀態通常會回歸正常。

方法三 修改內核,將其進程狀態轉化為別的狀態,然后kill掉。

  1. 創建目錄kill_D_process,進入目錄繼續

  2. 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); 
  1. touch Makefile 文件,寫入:
 obj-m := killd.o 
  1. 執行如下命令。生成一堆文件,其中有文件killd.ko。
# 必須存在內核源碼
make -C /usr/src/kernels/2.6.32-754.23.1.el6.x86_64/ M=`pwd` modules
  1. 找到處於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目錄

來源:

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

https://www.cnblogs.com/shengulong/p/11674004.html

擴展:
https://www.cnblogs.com/embedded-linux/p/7043569.html


免責聲明!

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



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