如何杀掉D状态的进程?[zt]【转】

转自:http://blog.csdn.net/chinalinuxzend/article/details/4288791

[-]

  1. 如何杀掉D状态的进程zt
    1. 相关博文

原贴: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

时间: 2024-10-19 22:07:45

如何杀掉D状态的进程?[zt]【转】的相关文章

杀掉那些死锁的进程

前些天,同事遇到一个死锁的问题,又想起三年前面试的时候问的一个with(nolock)相关的问题,一下子不知道怎么解锁,走过去看看,一下子不知道怎么写,忙活了一会,弄出个东东,核心主要是视图sys.SysProcesses,它源自于系统表sysprocesses,前者是微软推荐的用法,因为后者在未来SQL Server版本中可能会被隐藏.视图字段含义见这里.然后是kill 命令,它加上进程id就可以杀掉相应进程,它的简单用法如下: 1 use Test 2 go 3 -- 列出所有进程信息 4

Android 杀掉当前程序的进程

在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下所示: android.os.Process.killProcess(android.os.Process.myPid()); 其中,killProcess()方法用于杀掉一个进程,它接收一个进程id参数,我们可以通过myPid()方法来获得当前程序的进程id. 需要注意的是,killProcess()方法只能用于杀掉当前程序的进程,我们不能使用这个方法去杀掉其他程序.

Linux x86 64内核终止D状态的进程

在上一篇文章<Linux x86内核终止D状态的进程>中,我展示了32位x86系统中如何编码杀死D进程.本文我将展示一种64位x86系统上的方法.        说实话,64位系统上做这样的事是比较难的,因为你无法通过修改p->thread.ip来到达将进程拽出死循环的目的.要想知道64位系统上到底该怎么把进程执行绪引出,我们得先看看"标准"的做法是什么. 标准的做法就是fork时的行为,一个新进程刚刚被创建,它第一次进入运行状态之前,并不是通过switch_to切出

shell 一次性杀掉相同名称的进程

这条命令将会杀掉所有含有关键字"LOCAL=NO"的进程 ps -ef|grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9 另一种方法,使用awk ps x|grep gas|grep -v grep |awk '{print $1}'|xargs kill -9 下面将这条命令作一下简单说明: 管道符"|"用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入. "ps -ef" 

C# 杀掉系统中的进程

杀掉系统进程之前首先要知道进程名称(说了句废话),这里要注意在任务管理器中的进程名称不一定是真实的名称.打个比方,我们开启一个"记事本",任务管理器中进程名称为"记事本",但是实际名为"notepad".如果不知道在哪里看,可以点开任务管理器中的进程右击属性查看,一般都是xxx.exe形式. 接下来我们开始写代码,可以循环取到系统中所有正在运行的进程,然后根据name和id匹配将要删除的进程,值得注意的是:开启多个"记事本"进

vmstat——显示虚拟内存状态、进程、内存、I/O等

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 说明 procs:进程 r 表示运行队列(就是说多少个进程真的分配到CPU) b 表示阻塞的进程 memory:内存 swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理

ps + kill杀掉无知驻留的进程

1. 系统中执行过的脚本或者命令, 有的会一直在后台执行 2. 系统中执行的任务,用户是${USER}; 脚本一般放到Music目录下 3. 所以使用ps找出程序执行的PID时,可以这样: $ ps -aux | grep ${USER} | grep Music user   29283  0.0  0.0   7636   892 pts/1    S+   18:23   0:00 grep --color=auto Music 精确定位,然后干掉. $ kill -9 29283

Linux进程的Uninterruptible sleep(D)状态【转】

转自:http://c20031776.blog.163.com/blog/static/68471625201121522824111/ 运行在KVM虚拟机里的一些进程突然出了问题,这些出了问题的进程无法用kill杀掉,使用ps可以看到这些进程处于D状态: [[email protected] ~]$ ps -a -ubuild -o pid,ppid,stat,command PID PPID STAT COMMAND 17009 1 Ds -bash 17065 1 D ls --colo

进程三种基本状态

进程的三种基本状态: (1)       就绪状态:进程已获得除CPU外的所有必要资源,只等待CPU时的状态.一个系统会将多个处于就绪状态的进程排成一个就绪队列. (2)       执行状态:进程已获CPU,正在执行.单处理机系统中,处于执行状态的进程只一个:多处理机系统中,有多个处于执行状态的进程. (3)       阻塞状态:正在执行的进程由于某种原因而暂时无法继续执行,便放弃处理机而处于暂停状态,即进程执行受阻.(这种状态又称等待状态或封锁状态) 通常导致进程阻塞的典型事件有:请求I/