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 --color=tty -al  17577     1 D    /usr/java/jdk1.5.0_17/bin/java -Xmx512m -classpath /usr/local/a  17629     1 D    /usr/java/jdk1.5.0_17/bin/java -Xmx512m -classpath /usr/local/a

ps 的手册里说D状态是uninterruptible sleep,Linux进程有两种睡眠状态,一种interruptible sleep,处在这种睡眠状态的进程是可以通过给它发信号来唤醒的,比如发HUP信号给nginx的master进程可以让nginx重新加载配置文件而不需要重新启动nginx进程;另外一种睡眠状态是uninterruptible sleep,处在这种状态的进程不接受外来的任何信号,这也是为什么之前我无法用kill杀掉这些处于D状态的进程,无论是”kill”, “kill -9″还是”kill -15″,因为它们压根儿就不受这些信号的支配。

进程为什么会被置于uninterruptible sleep状态呢?处于uninterruptible sleep状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO,如果进程正在等待的IO在较长的时间内都没有响应,那么就很会不幸地被 ps看到了,同时也就意味着很有可能有IO出了问题,可能是外设本身出了故障,也可能是比如挂载的远程文件系统已经不可访问了,我这里遇到的问题就是由 down掉的NFS服务器引起的。

正是因为得不到IO的相应,进程才进入了uninterruptible sleep状态,所以要想使进程从uninterruptible sleep状态恢复,就得使进程等待的IO恢复,比如如果是因为从远程挂载的NFS卷不可访问导致进程进入uninterruptible sleep状态的,那么可以通过恢复该NFS卷的连接来使进程的IO请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个Linux系统了。

看到有人说如果要想杀掉D状态的进程,通常可以去杀掉它的父进程(通常是shell,我理解的这种情况是在shell下直接运行的该进程,之后该进程转入了D状态),于是我就照做了,之后就出现了上面的状态:他们的父进程被杀掉了,但是他们的父进程PID都变成了1,也就是init进程,这下可如何是好?此时我这些D状态的进程已经影响到其他一些进程的运行,而已经无法访问的NFS卷又在段时间内无法恢复,那么,只好重新启动了,root不是玉皇大帝,也有无奈的时候。

czhang说起这个事,觉得Linux如果有这么一个专用的垃圾回收进程就好了:系统自动或者用户手动把僵尸进程,和比如之前我遇到的D状态进程的PPID设为这个垃圾回收进程,那么通过干掉这个垃圾回收进程来清理这些僵尸们,这样该有多美好…

时间: 2024-11-24 10:13:30

Linux进程的Uninterruptible sleep(D)状态【转】的相关文章

Linux进程及作业管理

一.进程查看及其管理工具 --------------------------------------------- ps命令:报告当前进程的快照信息 ps - report a snapshot of the current processes. 选项: -A:显示所有进程与-e相同的效果 -a:不与终端相关的所有进程 -u:与用户相关的进程 -x:通常和a,u结合使用,显示出来比较全面的信息 -f:做一个更为完整的输出 常用的组合:     ps -ef 以完整的信息显示所有进程信息   

20150917 Linux进程查看与管理以及作业管理

第一.基础知识 MBR引导--内核--内核程序-->协调其它程序 一般内核运行在硬件之上,各应用也在硬件之前 1)OS的基本功能:文件系统.网络功能.进程管理.内存管理.驱动程序.安全功能 以上为通用目的设置的程序., 程序=指令+数据, 程序运行在内存当中.这个内存由物理内存映射逻辑空间 左则表示二个框分别表示指令和数据.物理内存划分固定大小的页框称为pageframe. 右则下面的方框表示物理内存.每个进程在右则上面的方框中,这部分为假的内存 空间称为线性地址空间. 2)CPU指令:  四个

9-17 linux进程查看和管理

Linux进程查看与管理 OS的基本功能:文件系统.网络功能.进程管理.内存管理.驱动程序.安全功能 程序=指令+数据 CPU:  特权指令  普通指令 程序执行环境:  内核模式:运行内核级指令  用户模式:运行普通指令 应用程序:   运行普通指令:直接运行于CPU   运行特权指令:通过system call 内存:8bits, 1byte  32bits, 2^32, 0-2^32-1, 2^10*2^10*2^10*2^2 bytes = 2^10*2^10*2^2 kilo byte

Linux进程/进程管理工具

Linux进程概念 Linux下进程的管理(进程管理命令以及一些工具) 1. Linux进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. 通俗点讲,想象一台独立的电脑,里面有很多用户自行安装的程序,用户打开应用程序,这个操作就是把程序调到内存中执行,在内存中执行的这个"程序"就是进程,无论实在Linux中还是Windows中,产生进程的同时都会生成一个ID称之为PID

Linux进程管理.md

目录 Linux进程管理 1.进程基本概述 1.1.进程的组成部分 1.2.进程的环境 1.3.进程的产生 1.4.进程的分类 2.进程状态 2.1.Linux进程状态 3.2.进程优先级 3.3.相对优先级 3.4.nice级别与权限 3.5.进程优先级调整 4.进程管理命令 4.1.ps 4.2.pstree 4.3.pgrep 4.4.pidof 4.5.vmstat 5.控制作业 5.1.作业与会话 5.2.作业分类 5.3.在后台运行作业 6.进程间通信 7.使用信号控制进程 8.监控

Linux进程的睡眠和唤醒

1   Linux进程的睡眠和唤醒 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING.一旦一个运行中的进程时间片用完, Linux内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行. 当然,一个进程也可以主动释放CPU的控制权.函数schedule()是一个调度函数,它可以被一个进程主动调用,从而调度其它进程占用CPU.一旦这个主动放弃CPU的进程被重新调度占用CPU,那么它将从

Linux进程管理简谈

Linux系统进程管理简谈 进程是什么? 简单来说进程是一个正在执行的程序的一个副本,存在生命周期,有段指令和代码在不断运行. linux内核存储信息的固定格式:task struct 进程的相关信息存储在链表中 多个任务的task struct组件的链表:task list 进程的创建:父进程创建子进程(内核创建init进程,剩余一切进程有init及其子进程进程创建) 父进程创建子进程时向内核调用fork()来创建子进程并且通过调用clone()复制父进程的信息给子进程 Linux进程的优先级

Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872659 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 前景回顾 1 Linux的调度器组成 2 调度工作 进程上下文 1 进程上下文的概念 2 上下文切换 context_switch进程上下文切换 1 context_switch完全注释 2 prepare_arch_switch切换前的准备工作

Linux进程基础知识总结

                                    进程 进程表示一个正在运行的程序实例,它是分配资源的最小单位,这种说法特别官方. 进程是一个非常重要的东西,我们运行的系统中同时跑着N个进程,这些进程都在默默的工作着,我们编写的代码,经过编译.运行,也会生成一个进程.这个进程由程序代码.数据.变量(占用着系统内存).打开的文件(文件描述符)和环境组成.一般来说,对于Linux系统,系统会在进程之间共享程序代码和系统函数库,所以在任何时刻,内存中都只存在代码的一份副本. 由于