`
zhengdl126
  • 浏览: 2539775 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

僵尸Z进程和D进程

 
阅读更多

 

-------------- 1 关于ZOMBIE进程:

 

# ps -el| grep Z
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 Z     0  3288  3278  0  80   0 -     0 exit   ?        00:00:00 sh <defunct>
0 Z     0  7289  7282  0  80   0 -     0 exit   ?        00:00:00 sh <defunct>
0 Z     0  9862  9856  0  80   0 -     0 exit   ?        00:00:00 sh <defunct>
# ps -ef |grep defunct
root      3288  3278  0 Feb19 ?        00:00:00 [sh] <defunct>
root      3789  1710  0 17:05 pts/8    00:00:00 grep defunct
root      7289  7282  0 07:11 ?        00:00:00 [sh] <defunct>
root      9862  9856  0 Feb26 ?        00:00:00 [sh] <defunct>

 


这些进程已经死亡,但没有释放系统资源,包括内存和一些一些系统表等, 如果这样的进程很多,会引发系统问题。用ps -el看出的进程状态如果是Z,就是僵尸进程。

 

Z 之所以杀不死,是因为它已经死了,否则怎么叫 Zombie(僵尸)呢?冤魂不散,自然是生前有结未解之故。在UNIX/Linux中,每个进程都有一个父进程,进程号叫PID(Process ID),相应地,父进程号就叫PPID(Parent PID)。当进程死亡时,它会自动关闭已打开的文件,舍弃已占用的内存、交换空间等等系统资源,然后向其父进程返回一个退出状态值,报告死讯。如果程序有 bug,就会在这最后一步出问题。儿子说我死了,老子却没听见,没有及时收棺入殓,儿子便成了僵尸。在UNIX/Linux中消灭僵尸的手段比较残忍,执 行 ps axjf 找出僵尸进程的父进程号(PPID,第一列),先杀其父,然后再由进程天子 init(其PID为1,PPID为0)来一起收拾父子僵尸,超度亡魂,往生极乐。注意,子进程变成僵尸只是碍眼而已,并不碍事,如果僵尸的父进程当前有 要务在身,则千万不可贸然杀之

 

 

清除ZOMBIE(僵尸)进程可以使用如下方法:
1> kill –18 PPID (PPID是其父进程)
这个信号是告诉父进程,该子进程已经死亡了,请收回分配给他的资源。
2>如 果不行则看能否终止其父进程(如果其父进程不需要的话)。先看其父进程又无其他子进程,如果有,可能需要先kill其他子进程,也就是兄弟进程。方法是:
kill –15 PID1 PID2(PID1,PID2是僵尸进程的父进程的其它子进程)。
然后再kill父进程:kill –15 PPID
这 样僵尸进程就可能被完全杀掉了。

 

 

ps alx | grep 17191

lsof -p 进程ID
pstree -p 进程ID
ps -p 进程ID

 

详细信息查看:

/proc/[PID]/stat

 

[root@localhost ~]# cat /proc/6873/stat
6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0 [root@localhost ~]#


每个参数意思为:
参数 解释
pid=6873 进程(包括轻量级进程,即线程)号
comm=a.out 应用程序或命令的名字
task_state=R 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=6723 父进程ID
pgid=6873 线程组号
sid=6723 c该任务所在的会话组ID
tty_nr=34819(pts/3) 该任务的tty终端的设备号,INT(34817/256)=主设备号,(34817-主设备号)=次设备号
tty_pgrp=6873 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
task->flags=8388608 进程标志位,查看该任务的特性
min_flt=77 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=0 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=0 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=0 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
utime=1587 该任务在用户态运行的时间,单位为jiffies
stime=1 该任务在核心态运行的时间,单位为jiffies
cutime=0 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
cstime=0 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
priority=25 任务的动态优先级
nice=0 任务的静态优先级
num_threads=3 该任务所在的线程组里线程的个数
it_realvalue=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
start_time=5882654 该任务启动的时间,单位为jiffies
vsize=1409024(page) 该任务的虚拟地址空间大小
rss=56(page) 该任务当前驻留物理地址空间的大小
Number of pages the process has in real memory,minu 3 for administrative purpose.
这些页可能用于代码,数据和栈。
rlim=4294967295(bytes) 该任务能驻留物理地址空间的最大值
start_code=134512640 该任务在虚拟地址空间的代码段的起始地址
end_code=134513720 该任务在虚拟地址空间的代码段的结束地址
start_stack=3215579040 该任务在虚拟地址空间的栈的结束地址
kstkesp=0 esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip=2097798 指向将要执行的指令的指针, EIP(32 位指令指针)的当前值.
pendingsig=0 待处理信号的位图,记录发送给进程的普通信号
block_sig=0 阻塞信号的位图
sigign=0 忽略的信号的位图
sigcatch=082985 被俘获的信号的位图
wchan=0 如果该进程是睡眠状态,该值给出调度的调用点
nswap 被swapped的页数,当前没用
cnswap 所有子进程被swapped的页数的和,当前没用
exit_signal=17 该进程结束时,向父进程所发送的信号
task_cpu(task)=0 运行在哪个CPU上
task_rt_priority=0 实时进程的相对优先级别
task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程

 

 

这类进程是有问题的. 需要回收资源.
在unix程序设计的一本书里印像有一种情况会出现这样的进程.
主程序fork出的子进程结束之后. 父进程没有释放子进程所占用的资源. 这时这个进程就一直是zombie状态.



---- 百科:

  ZOMBIE:僵尸状态,表示进程结束但尚未消亡的一种状态,此时进程已经结束运行并释放大部分资源,但尚未释放进程控制块。

  与ZOMBIE对应的进程状态还有RUNNING(正在运行或等待运行状态),UNINTERRUPTABLE(不可中断阻塞状态),INTERRUPTABLE(可中断阻塞状态),STOPPED(挂起状态)。

 

服务器通常都会带来一些僵尸进程,占用系统资源,浪费资源等,一般我们使用top命令就可以看得出来,如图:

 

(可以看到,我的服务器已经产生了两个僵尸进程)

 

解决方法:

  #ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"    //先查看具体进程:

      #lsof -p ppid;

      #lsof -p pid;
  #kill -9 pid号         //杀死z进程(这些动作是比较危险的,希望在真正的服务器上面慎用!!!)

 
假若你的z进程比较多,可以编写个小小的脚本,下面是参与网上的

#ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill

 

 

 

 

 

首先,我们可以用top命令来查看服务器当前是否有僵尸进程,可以看到第二行行尾有个 0 zombie,如果数字大于0,那么意味着服务器当前存在有僵尸进程  可以用ps和grep命令寻找僵尸进程

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

命令选项说明:

-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程

运行结果参考如下
Z 12334 12339 /path/cmd
这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死
如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行
kill -HUP 12334来解决问题

 

 

----

 

1) 检查当前僵尸进程信息

# ps -ef | grep defunct | grep -v grep | wc -l

175

# top | head -2

top - 15:05:54 up 97 days, 23:49, 4 users, load average: 0.66, 0.45, 0.39

Tasks: 829 total, 1 running, 479 sleeping, 174 stopped, 175 zombie

# ps -ef | grep defunct | grep -v grep

2) 获得杀僵尸进程语句

# ps -ef | grep defunct | grep -v grep | awk '{print "kill -9 " $2,$3}'

执行上面获得的语句即可, 使用信号量9, 僵尸进程数会大大减少.

3) 过一会儿检查当前僵尸进程信息

# ps -ef | grep defunct | grep -v grep | wc -l

125

# top | head -2

top - 15:29:26 up 98 days, 12 min, 7 users, load average: 0.27, 0.54, 0.56

Tasks: 632 total, 1 running, 381 sleeping, 125 stopped, 125 zombie

发现僵尸进程数减少了一些, 但还有不少啊.

4) 再次获得杀僵尸进程语句

# ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'

执行上面获得的语句即可, 这次使用信号量18杀其父进程, 僵尸进程应该会全部消失.

5) 过一会儿再检查当前僵尸进程信息

# ps -ef | grep defunct | grep -v grep | wc -l

0

# top | head -2

top - 15:39:46 up 98 days, 23 min, 7 users, load average: 5.46, 2.20, 1.12

Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie

6) 清除ZOMBIE(僵尸)进程原理

# kill -18 PPID

PPID是其父进程, 这个信号是告诉父进程, 该子进程已经死亡了, 请收回分配给他的资源. 如果还不行则看先看其父进程又无其他子进程, 如果有, 可能需要先kill其他子进程, 也就是兄弟进程.

方法是:

# kill -15 PID1 PID2

PID1,PID2是僵尸进程的父进程的其它子进程.

然后再kill父进程:

# kill -15 PPID

 

 

 

 

 =======================2  Linux进程的Uninterruptible sleep(D)状态

 

 

 

D,往往是由于 I/O 资源得不到满足,而引发等待,在内核源码 fs/proc/array.c 里,其文字定义为“ "D (disk sleep)", /* 2 */ ”(由此可知 D 原是Disk的打头字母),对应着 include/linux/sched.h 里的“ #define TASK_UNINTERRUPTIBLE 2 ”。举个例子,当 NFS 服务端关闭之时,若未事先 umount 相关目录,在 NFS 客户端执行 df 就会挂住整个登录会话,按 Ctrl+C 、Ctrl+Z 都无济于事。断开连接再登录,执行 ps axf 则看到刚才的 df 进程状态位已变成了 D ,kill -9 无法杀灭。正确的处理方式,是马上恢复 NFS 服务端,再度提供服务,刚才挂起的 df 进程发现了其苦苦等待的资源,便完成任务,自动消亡。若 NFS 服务端无法恢复服务,在 reboot 之前也应将 /etc/mtab 里的相关 NFS mount 项删除,以免 reboot 过程例行调用 netfs stop 时再次发生等待资源,导致系统重启过程挂起。

 

 


运行在KVM虚拟机里的一些进程突然出了问题,这些出了问题的进程无法用kill杀掉,使用ps可以看到这些进程处于D状 态:

[build@kbuild-john ~]$ 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不是玉皇大 帝,也有无奈的时候。

 

 

 

 

 

 

  • 大小: 41.8 KB
分享到:
评论

相关推荐

    特殊进程之僵尸进程测试代码

    此时,操作系统会将进程的状态改为“Z”,即僵尸状态。这时,进程的内存空间被释放,但进程控制块(PCB)仍保留在系统中,等待父进程通过`wait()`或`waitpid()`函数来获取它的退出状态信息。如果父进程没有调用这些...

    linux中的僵尸进程

    4. **PS命令显示**:使用`ps`命令查看进程时,僵尸进程会显示为“Z&lt;”或“defunct”。 #### 四、如何避免僵尸进程 为了避免僵尸进程的产生,可以通过以下几种方式: 1. **调用`wait`或`waitpid`函数**:父进程...

    Linux寻找和杀掉僵尸进程的命令和方法

    这些僵尸进程虽然不再执行任何操作,但仍然占据着系统资源,如进程表项,从而影响系统的性能和稳定性。本文将详细介绍如何在Linux系统中寻找和杀掉这些僵尸进程。 ### 一、理解僵尸进程 僵尸进程是指一个已经结束...

    在Linux系统中查看进程及杀死僵尸进程的方法.docx

    通过本文的学习,我们了解了如何在Linux系统中使用`ps`命令查看和管理进程,特别是如何有效地处理僵尸进程。正确地管理和维护进程不仅有助于提高系统的稳定性和响应速度,还能避免因资源泄露而导致的问题。希望本文...

    「杀不掉的」僵尸(zombie)进程

    在Linux系统中,进程可以处于多种不同的状态,而其中一种特殊的状态被称为“僵尸”状态(Z)。当一个进程终止时,其父进程应当通过`wait()`或`waitpid()`系统调用来收集子进程的状态信息并清理相应的资源。然而,...

    Linux中僵尸进程和孤儿进程详解

    - **状态停滞**:僵尸进程处于终止状态(Z状态),但未被父进程收集。 - **资源占用**:虽然僵尸进程不再占用CPU时间,但它仍然占据进程表中的一条记录,导致一定的资源浪费。 - **回收机制**:如果父进程始终不调用...

    06:进程和计划任务管理.docx

    进程的状态包括运行(R)、睡眠(S)和僵尸(Z)等,可以通过`ps`命令来查看这些状态。 `ps`命令用于查看当前系统的进程状态,它可以提供进程的静态快照。例如,`ps aux`会显示所有用户在所有终端上的进程信息,...

    LINUX查看和处理僵死进程

    查看僵死进程可以使用ps命令,例如`ps -el`可以显示进程的状态,如果状态是Z,就是僵尸进程。也可以使用`ps -ef|grep defunc`命令来查找僵尸进程。 僵死进程的出现可能是因为父进程没有正确地释放子进程的资源,...

    Linux 进程管理命令

    * Z:僵尸进程 * 优先级高的进程 * N:优先级较低的进程 * L:有些页被锁进内存 * s:进程的领导者(在它之下有子进程) * l:is multi-threaded(using CLONE_THREAD, like NPTL pthreads do) * +:位于后台的进程...

    Linux 进程管理

    同时,我们可以通过`^Z`暂停命令执行,使用`fg`将其重新带回前台继续执行,或者使用`kill %1`命令来杀死被暂停的进程。 5. **`at`命令**:用于安排在将来某个时间点执行的命令。例如: ``` at now + 5 minutes `...

    Linux下的进程状态

    7. **Z (Defunct or Zombie)**:僵尸状态。进程已经终止,但其父进程尚未调用`wait()`系统调用来清理子进程的资源。僵尸进程会占用一定的系统资源,但不消耗CPU时间。 #### 扩展状态标记 除了上述基本状态外,在...

    linux系统进程管理

    - **& 和 Ctrl+Z**:用于将进程置于后台运行或将其挂起。 #### Proc文件系统 Proc文件系统是一种特殊的文件系统,它提供了有关正在运行的进程的信息。通过访问`/proc`目录下的特定文件,可以获得进程的详细信息,...

    linux多进程编程

    - `ps`命令可以用来查看进程的状态,如D表示不可中断睡眠,R表示正在运行或可运行,S表示可中断睡眠,T表示停止,W表示换页,X表示死进程,Z表示僵尸进程。 3. **进程调度**: - CPU一次只能执行一个进程,但通过...

    demo_zimbi

    在IT行业中,操作系统管理着各种进程的生命周期,其中包括一种特殊状态的进程...在日常运维中,定期检查和清理僵尸进程是必要的维护工作,而“demo_zimbi”项目提供了一种自动化解决方案,使得这一过程更加高效和便捷。

    Linux学习之进程列表符号对应含义.pdf

    - `Z`: 僵尸(进程已结束,但其父进程尚未回收资源) - `N`: 低优先级(nice值较高) - `L`: 锁定在内存中(不能被交换到磁盘) 6. **UID**: 启动进程的用户ID,用于权限管理和安全控制。 除了了解这些基本符号...

    进程的基础知识

    5. **Z** - 僵尸状态:进程已终止,但其信息仍保留在系统中,等待父进程回收。 **五、进程的内存结构** Linux采用虚拟内存管理,每个进程都有4GB的独立地址空间,分为用户空间(0-3GB)和内核空间(3-4GB)。用户...

    第十章 CentOS7-系统进程管理.pdf

    Z:僵尸状态,进程已经结束,但是父进程尚未回收资源。 D:不可中断状态,进程正处于等待某些硬件条件,不可被杀死。 进程状态后面可能还会跟有其他字母,表示额外的状态信息。例如: 表示进程运行在高优先级上。 ...

    E11:UNIX V6++进程创建与父子进程同步1

    在这种情况下,子进程的`p_stat`状态可能会标记为`Z`(僵尸状态),表示进程已结束但其资源尚未被回收,而`p_flag`可能包含表示等待状态的标志。子进程的进程映像会在系统找到足够的内存资源时被搬入内存,通常是在...

    Linux进程管理

    进程状态可以是运行(R)、休眠(S)或僵尸(Z)等。优先级决定了进程获取CPU时间的顺序,而进程的资源占用则描述了进程所使用的系统资源量。 在进程管理中,父子进程之间的关系非常重要。父进程负责管理子进程,但...

Global site tag (gtag.js) - Google Analytics