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

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

[复制链接]

2

主题

0

回帖

15

积分

管理员

积分
15
QQ
发表于 2019-7-5 23:50:05 | 显示全部楼层 |阅读模式
可以用ps和grep命令寻找僵尸进程, L6 i1 \/ ]+ X2 V* {
6 X5 G: K7 t( O8 _$ d# l
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
4 K# ?4 W, H$ g2 H+ \- Z9 j
' I1 Z. F. e1 \& p4 @: {" n* |命令选项说明:2 g- X" @6 ?8 n1 a. R
6 U: ^9 _' W$ R7 S8 n' m
-A 参数列出所有进程
: Y# E2 t  P# M* a' J& R8 N9 C-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
7 A8 F' |6 `2 ~$ q因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程8 n; ?) @) p2 a- T2 H. y( M

  Q- L. ?, F. h. E运行结果参考如下/ `5 J  h" r& t1 I
Z 12534 12339 /path/cmd
' E- f# U/ V4 k1 ?2 G* o( R这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程4 B$ W& ^- o8 {0 [0 S& M, D
8 L2 W* T$ d% s6 |
运行后,可以再次运行+ ?) t* m& @# o1 Q! v1 l3 P
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' / @* ^3 N' f3 z' A5 A$ Q
来确认是否将僵尸进程杀死2 w+ H- v2 ?6 l. J
如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12534,那么我们就运行
, }: a6 z' {4 a. u  @; ~. f" ]kill -HUP 12534来解决问题

2

主题

0

回帖

15

积分

管理员

积分
15
QQ
 楼主| 发表于 2019-7-5 23:50:52 | 显示全部楼层
检查当前僵尸进程信息7 s# C# L  }. R7 \, Z
$ w% j8 e: K7 s4 q: X3 J6 |4 l
ps -ef | grep defunct | grep -v grep | wc -l/ q' s: w8 U& ], _# o
查看TOP前两行信息
1 {  R3 K" V0 X( I3 t' v+ ?/ g; n: @# c, L; K
top | head -2
7 ^0 r2 g/ h! d1 |6 ?/ N: H直接杀死进程
& a% H$ m& {; D! t4 t
+ r3 g" ?& l8 \$ W$ c7 X/ `; G 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 */
3 z# G6 m2 K1 r6 N#include <sys/types.h>
/ }, K5 Z+ e$ x* @#include <unistd.h>  main()
, u; Y% z8 S$ E' ^, ^{: z# X% Q& H! J6 ~* T, w& n9 D: h
    pid_t pid; 0 C9 }' Q; r9 \# U  d
    pid=fork();
$ r& j3 e- K, Y    if(pid<0) {
8 R1 ~& N- V% }. r" u  K/* 如果出错 */
5 z1 h5 g3 Q1 y- f! \ # M4 J  X* w) s( b
        printf("error occurred!\n");/ v$ y1 e5 U1 W5 T5 L
    }else if(pid==0){, R9 Y/ X& {, ^6 t
/* 如果是子进程 */2 O" g4 ~5 m8 _) W8 o' C, s
9 d) H+ r# N0 s1 t5 U, M6 e
        exit(0);
1 q1 }8 W* V$ a" T2 N- R    }else{ 8 X5 E+ Y) ]: X1 [
/* 如果是父进程 */) d; ~; l9 t. F

1 a1 G  l/ }/ c% z# j% d5 v        sleep(60);
) j, K/ u! P/ X1 F5 q. r; C/* 休眠60秒 */
) y" A, X" D2 W+ d
* ~) {! n9 P1 ?/ M8 U3 E1 f        wait(NULL);
& B  ]9 h6 x+ W6 `/* 收集僵尸进程 */
8 ^( w, U3 N9 G$ H5 y' \0 q    }
$ V# v5 @! b- ~) n: n( j; R}

2

主题

0

回帖

15

积分

管理员

积分
15
QQ
 楼主| 发表于 2019-7-5 23:52:59 | 显示全部楼层
编译这个程序:
( f. g% B# h( j: v3 w4 _  z% i- Y/ b
$ cc zombie.c -o zombie& h3 K! m7 L. q0 t% e) o! f

) f' Q, g& O! K( t后台运行程序,以使我们能够执行下一条命令
: q8 a/ M) q; `2 s1 m: m$ ./zombie &
. N1 W) ?; P$ }; N& j[1] 1217- }. j8 S# o4 r
$ ps -ax
9 _/ C- ?. o* i5 g... ...1 @* X7 a) _0 W5 a- V( \) @6 W0 U1 r
1137   pts/0   S   0:00   -bash6 O9 {8 U+ ]: U+ f, @
1217   pts/0   S   0:00   ./zombie& j: [% Q+ g5 t% ~
1218   pts/0   Z   0:00   [zombie]  S8 h8 i3 v% O
1578   pts/0   R   0:00   ps   -ax+ c9 \# M' I0 T# [: S. J1 L8 G; X
0 |) i8 o, L; }3 S' ~; |
其中的”Z”就是僵尸进程的标志,它表示1218号进程现在就是一个僵尸进程。
$ X& }4 }  D9 x0 }; j( s  H( W3 ^8 ]; C- J! z: q* x2 G
收集Zombie进程的信息,并终结这些僵尸进程,需要我们在父进程中使用waitpid调用和wait调用。这两者的作用都是收集僵尸进程留下的信息,同时使这个进程彻底消失。9 w9 J; B. t7 V8 I0 N8 @: o) v
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 06:46 , Processed in 0.026307 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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