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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-7-5 23:50:05 | 显示全部楼层 |阅读模式
可以用ps和grep命令寻找僵尸进程
- i: p8 G; o1 s( x3 [
0 \) O, y3 N; k% y$ ^6 b+ Ups -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'9 Z/ b) x0 ]1 l7 ?* h. y: g

% X+ |, O/ }. Z. F命令选项说明:
" i9 q2 Y% l9 F1 d- h# |* b, I6 _, Z9 C4 }! ]
-A 参数列出所有进程0 `9 n, Z( Q' F( O3 v( y
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
, t3 O8 {& S" ^$ |- s9 j因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
4 f! r+ R0 I! h1 ?/ B) |. P) ~1 r5 D& M- L$ U! ~6 o) P3 S
运行结果参考如下5 Z% o3 k2 o9 w
Z 12534 12339 /path/cmd
8 w$ f  X# t6 p5 d8 {  n0 @) i这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
  s8 z  j$ b' `# N
  l6 ]/ H9 D# n/ a运行后,可以再次运行/ i. b0 ^+ m, C- j* j; f( \
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
5 K1 R0 f/ K# A6 w& u来确认是否将僵尸进程杀死
, X* i: ]: m+ Z# e如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12534,那么我们就运行4 s8 V0 }  |+ [1 L
kill -HUP 12534来解决问题

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-7-5 23:50:52 | 显示全部楼层
检查当前僵尸进程信息/ ?/ N7 D! B' V, b$ H

* U! x9 x2 X! w6 }ps -ef | grep defunct | grep -v grep | wc -l9 F9 o! f" Y; S
查看TOP前两行信息
9 U% B/ c, C( _9 C
$ L4 \9 {5 p2 r6 m/ xtop | head -2; e% h( [4 A- C4 R0 n$ t  X# Z6 v# U
直接杀死进程
1 j% r+ `$ N1 D. b& x
4 |$ V  C) k7 M" R6 Y ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-7-5 23:51:30 | 显示全部楼层
/* zombie.c */( Q5 [6 \. p3 U8 L  F; p
#include <sys/types.h>, c% \2 e. h) G6 D& T
#include <unistd.h>  main()
  C# ^  g  l6 i) h/ n% }{, ]% _6 z. A1 _5 J3 X  K  o
    pid_t pid; ) {# K' f+ d1 F/ @& h7 S2 Z
    pid=fork();: p1 }5 g6 J0 Q  G! k# L, n6 z' ?
    if(pid<0) {
3 E) h; x2 x: u/* 如果出错 */  `7 A: R" n# }5 R/ n

( E5 @3 n. ?7 D( f/ z8 X        printf("error occurred!\n");
# o8 R0 ]4 W4 ~+ X5 L7 `    }else if(pid==0){  `3 A7 {. ^: x( j( ~# N
/* 如果是子进程 */
- G+ ~# E# q' Q! H/ T7 y + M, M! a3 k* y3 g
        exit(0);
  `, ^, b5 n4 G. _( Z4 }    }else{ % h& h" m  P: }5 R& J: L3 @
/* 如果是父进程 */
3 n8 l1 s1 f9 A0 {3 Q2 [ . i" W. D4 l% u8 Q0 m7 w! Q
        sleep(60);
4 y8 N  V: g3 n* X9 ]/* 休眠60秒 */* h2 f3 H& n* X5 r/ q, ?! F3 Z9 `2 g8 t
0 @% f$ }% h- a/ @2 D7 w( s) j
        wait(NULL);. t+ U3 M+ ~$ U1 U8 m
/* 收集僵尸进程 */! X* r6 F; H- u# B
    }
( A' t# n: F2 N) [}

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-7-5 23:52:59 | 显示全部楼层
编译这个程序:# _! a; h1 ]- v  _5 |4 J. Z

' [; Y. R7 _. W$ cc zombie.c -o zombie
3 M7 X5 c0 `. I$ R* Z2 |" ^
% _3 E% {. |$ L5 Y; w# ]后台运行程序,以使我们能够执行下一条命令
! k: z0 B/ F8 K# M5 _$ ./zombie &7 k% Y2 d& y( |/ l. W) `( t: Q
[1] 1217
6 D( L  O- h& B% {; C$ ps -ax
% t, b4 A$ V: ]  a( Q9 T... ...! x/ B6 Y: z2 u7 h2 g5 U" N
1137   pts/0   S   0:00   -bash
  l) ~! {, g% q0 A% Z7 _+ t1217   pts/0   S   0:00   ./zombie
: s0 }$ a3 C( C1218   pts/0   Z   0:00   [zombie]
- N% R0 Y9 l& }. n1578   pts/0   R   0:00   ps   -ax
7 ^, u7 T( D% g; r" \7 r! C% J
9 O- d7 e; ~) ^9 E其中的”Z”就是僵尸进程的标志,它表示1218号进程现在就是一个僵尸进程。" \9 u( V7 j1 \: f) m9 L) y

+ X# u0 o# t# D! h, l收集Zombie进程的信息,并终结这些僵尸进程,需要我们在父进程中使用waitpid调用和wait调用。这两者的作用都是收集僵尸进程留下的信息,同时使这个进程彻底消失。' J5 ~7 u4 _0 a' J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 05:39 , Processed in 0.021370 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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