找回密码
 注册
查看: 4777|回复: 3

在linux下利用top和ps查寻zombie进程

[复制链接]

2

主题

0

回帖

15

积分

管理员

积分
15
QQ
发表于 2019-7-5 23:50:05 | 显示全部楼层 |阅读模式
可以用ps和grep命令寻找僵尸进程. j3 M; R4 e( j4 x, e) Q  O0 N
' r5 v- I2 `3 w  k! ?7 d9 g
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
5 ?) R' d( [7 D4 a% o7 V7 y) H% G: x: E. Q
命令选项说明:
- \8 Q6 V& D% @) t. D( P$ _
. \9 Z* n8 `' \, D# {( x1 b, ?- k-A 参数列出所有进程# {' T' W0 S' d- K) D
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
! R- Y9 |0 Q- |因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
) _& t  W- t4 K- F, K8 T- n. M8 _* ~# X2 v0 N6 q
运行结果参考如下, Q+ O9 U- G4 U& C1 K5 y
Z 12534 12339 /path/cmd: r. Y  {* {, T
这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
$ H# \+ C6 C. U2 P, ]0 j1 C& `* E! P5 a' F" `7 P
运行后,可以再次运行
: f) A  J2 Z2 f+ Bps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 4 }: ^1 l& c' w
来确认是否将僵尸进程杀死9 Z% L; Q% C  _$ @
如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12534,那么我们就运行" b" @" {) b1 z" y/ i, Q$ {, X
kill -HUP 12534来解决问题

2

主题

0

回帖

15

积分

管理员

积分
15
QQ
 楼主| 发表于 2019-7-5 23:50:52 | 显示全部楼层
检查当前僵尸进程信息
+ m6 {& ?) ~0 K2 s; A, X7 k; X* C) V) s2 i, e% E$ g6 {" X
ps -ef | grep defunct | grep -v grep | wc -l) F2 A" d4 ]5 O! Y
查看TOP前两行信息& n# T. P8 y3 C4 N# v& b9 q1 i) E
" c" D# I3 g; v8 D: A" ~
top | head -2& a+ Y% `. Q0 u1 K8 {+ M3 ?  d/ |
直接杀死进程- u& `- _. n. v1 @  O

; L: B! R. G+ V9 j* _5 {" ] ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'

2

主题

0

回帖

15

积分

管理员

积分
15
QQ
 楼主| 发表于 2019-7-5 23:51:30 | 显示全部楼层
/* zombie.c */  S6 G1 u7 J4 `* Q- T
#include <sys/types.h>
( e' [: m$ F1 H' ^0 ~+ A3 ^#include <unistd.h>  main(). m" U- n# `( q, f/ V
{
2 r, g7 e0 U) P* d: y* H) L    pid_t pid;
$ d0 n, A4 s' J/ U) L6 l    pid=fork();" b3 N  L6 C1 i/ X  t- B$ A9 `
    if(pid<0) {
( ]+ y& f* [6 P8 R& Y7 }/* 如果出错 */
& J$ U, ~! Q& }. N) \$ S5 Q& a
0 m9 X6 T  e* e5 H- O+ }5 \2 J2 |7 D8 w        printf("error occurred!\n");2 D9 U1 M; I  J! C" c
    }else if(pid==0){
% ]  }6 c/ k, f+ D! A3 p/* 如果是子进程 */3 s! ], y% a* _1 D

5 S2 X+ }- C  {. U8 l+ a        exit(0);/ ^! N& D% }. L5 f
    }else{
, H3 _: f" _! }  Q" o3 c: p3 e5 g/* 如果是父进程 */
& D9 z3 [% Q3 }9 B2 A! g- | 9 o) ~4 f4 S* F5 j
        sleep(60);
# {- R1 o) A6 \& z/* 休眠60秒 */0 X# P& |2 p5 U& p3 ~  V

, @. }1 C* @1 g# R7 M* {        wait(NULL);/ f3 g7 S6 V4 \
/* 收集僵尸进程 */
; w0 e! Q5 z0 F/ V5 J    }* T1 G- }( [/ W$ T4 a9 q
}

2

主题

0

回帖

15

积分

管理员

积分
15
QQ
 楼主| 发表于 2019-7-5 23:52:59 | 显示全部楼层
编译这个程序:7 O1 j+ S/ |! o5 S* y7 t. u/ N

4 G; D) J' r! R8 b$ cc zombie.c -o zombie
7 _+ C  T- K* j" T! N' d  M  t( \1 }3 s  k6 K4 G
后台运行程序,以使我们能够执行下一条命令" }, I0 P- g4 v7 Z, D  \( }
$ ./zombie &, `! w! P: ^. @- \3 E" @
[1] 1217
3 V9 F/ }( V/ ~$ ps -ax
2 S; h6 v8 C, o. K! X... ...4 i: h9 P, |7 K" s6 j
1137   pts/0   S   0:00   -bash. E' C+ N! B& A2 Q4 [
1217   pts/0   S   0:00   ./zombie" U+ B7 E% `" i
1218   pts/0   Z   0:00   [zombie]
5 l" C4 W, Z7 n- I+ D. X1578   pts/0   R   0:00   ps   -ax
0 M+ q0 |1 e+ Z2 i% U5 U5 b
; v' R  R- a8 `  h其中的”Z”就是僵尸进程的标志,它表示1218号进程现在就是一个僵尸进程。
2 l& ?  g* |! |( ?
" j! X, I; A" C7 C- {收集Zombie进程的信息,并终结这些僵尸进程,需要我们在父进程中使用waitpid调用和wait调用。这两者的作用都是收集僵尸进程留下的信息,同时使这个进程彻底消失。4 E& T+ |; c/ G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 06:45 , Processed in 0.026971 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表