易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4772|回复: 3
收起左侧

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

[复制链接]
发表于 2019-7-5 23:50:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
可以用ps和grep命令寻找僵尸进程/ |1 S- z' ^) D: Z+ v3 J

- q) Y7 d- e, S2 cps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
9 U% v& N; P( a  |2 U- k
/ S' O2 y9 ^! Q- q命令选项说明:+ k. {7 D+ S3 d, N! S8 X
5 N! ^  I1 \) v  ~5 M& h
-A 参数列出所有进程
! I" E$ ]' V5 O( D0 u9 M-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
+ f) e6 P2 b8 M  W, I+ _6 D因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程* J8 b7 ]! Z0 y3 {- R8 @7 f2 S4 Z
0 N" @5 ?. w2 Q1 c( g# n! h
运行结果参考如下. J5 p- L  Y* i5 G) r1 t6 P
Z 12534 12339 /path/cmd  [4 ]  _& M- [& Y  W% n2 E
这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
1 v) y- e8 }& _) Q' f% R; }, l; L" Z0 B7 F' C3 _% y8 A. T
运行后,可以再次运行
- P# \8 \$ p8 N! M8 B" kps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' # o5 ]- n0 q4 P& E) w" Z* s, c
来确认是否将僵尸进程杀死
5 Z1 z$ T' i( h如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12534,那么我们就运行, z2 f! K$ x, V+ r$ |/ c2 {. V
kill -HUP 12534来解决问题
 楼主| 发表于 2019-7-5 23:50:52 | 显示全部楼层
检查当前僵尸进程信息+ ^( B7 C2 R/ d: C9 H# A

1 k( D) |0 t. a1 Aps -ef | grep defunct | grep -v grep | wc -l( Y* F( K9 S" L1 h6 N5 }" U3 h
查看TOP前两行信息
! W0 K  H/ s  v- \( Z) H$ T0 ^( ~: O5 o  G& E1 d8 x
top | head -2$ \6 X: d) b3 s# W5 H, z
直接杀死进程
( Z1 z1 h" ]: y7 V) b: h/ R! w+ z: s9 x% V0 Z
ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'
 楼主| 发表于 2019-7-5 23:51:30 | 显示全部楼层
/* zombie.c */
5 u4 M. Q8 `# A% v% m6 N#include <sys/types.h>
/ S1 \6 f0 p# U  j#include <unistd.h>  main()
' s. X. H+ l, [{
3 m5 b3 v; w( P' _    pid_t pid; 9 B8 G7 ]; e4 A
    pid=fork();) \: d+ c6 h. E1 b
    if(pid<0) {2 ^7 ^8 Q+ M2 ^- \/ D
/* 如果出错 */
9 V6 o7 R0 S; I7 u& I# H, i ) M+ |' g0 c: j7 i3 {
        printf("error occurred!\n");
  I5 l% ?( C# b    }else if(pid==0){, i8 G0 l5 D  p/ l0 v! q8 U  c
/* 如果是子进程 */
; D" t9 e2 x( W. {% | 2 W/ `0 w3 H- I2 q$ C) K( V8 q
        exit(0);
, N$ v0 w/ K! z7 p    }else{
6 T6 I" C1 ?( B/* 如果是父进程 */
" C8 [. [. W  A0 ~' R
+ {# |4 P6 b  H. W        sleep(60);
; k) r& g. ?) M" d, Y/* 休眠60秒 */
! v, E  r2 S$ Y! L
4 Z9 |4 \" s# M" X  h1 u        wait(NULL);. d/ t  ]' z1 j4 V. c. ]9 ]9 Z
/* 收集僵尸进程 */
9 t6 U. |- \: s, z3 E4 i    }
, q! N7 y) }3 h7 l$ [8 R}
 楼主| 发表于 2019-7-5 23:52:59 | 显示全部楼层
编译这个程序:" R& Z- V6 }/ ]5 A- O9 N) F, X
9 Q0 K; S& F- [1 o6 s" g
$ cc zombie.c -o zombie
* M" \0 |/ h5 b7 t7 w& m. F" t" E" i! A5 C% G5 {1 p( r
后台运行程序,以使我们能够执行下一条命令
% l# O+ g3 J# o9 d$ ./zombie &! Q3 n" D+ h2 R/ [$ y5 m
[1] 12171 z5 N4 x* `, ?# B7 e1 r
$ ps -ax0 U7 N4 j( T1 E! ]( Q8 O4 u
... ...3 Z/ W' M+ X9 q5 |/ C- h
1137   pts/0   S   0:00   -bash
$ n! |% Z" r" n2 g' T0 Y- H$ X, F) K: [1217   pts/0   S   0:00   ./zombie# V0 [/ `  p! {
1218   pts/0   Z   0:00   [zombie]
3 T- A% s3 s$ h1578   pts/0   R   0:00   ps   -ax
% G' Q& f8 d+ f6 e  w5 a0 ~6 B3 s* J) s- F' V7 a
其中的”Z”就是僵尸进程的标志,它表示1218号进程现在就是一个僵尸进程。$ M* f0 J1 Q( B$ b* J* a
% m- \3 }# b5 L, O
收集Zombie进程的信息,并终结这些僵尸进程,需要我们在父进程中使用waitpid调用和wait调用。这两者的作用都是收集僵尸进程留下的信息,同时使这个进程彻底消失。
; `" j/ V7 _2 s, j8 ~
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:35 , Processed in 0.052022 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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