易陆发现互联网技术论坛

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

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

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

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

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

x
可以用ps和grep命令寻找僵尸进程! L& e: c7 ]; R& {5 W9 N

; i' ?* m+ ]2 q" G, P4 d/ rps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'3 H4 r: f% A* b8 D

( @% O: t+ j. B+ {; V0 L% c命令选项说明:. F3 N0 b: W2 _$ R& w* I

; o$ s& R% d8 S* y! s# ^: W-A 参数列出所有进程/ d" z3 L% g6 e) U  w4 L/ V6 [
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
/ D6 C% o: Z9 A因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程4 z! \7 I* U) ^# J$ ~& ?

) F; Z2 S8 m1 w, J  c: B2 g运行结果参考如下2 i( r  f% p6 G) e( X9 I
Z 12534 12339 /path/cmd
- _' n. D$ J1 H' Z) O; X) G! X' M$ R这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程5 ]% W0 [5 b. L6 _1 M- H

1 J5 a% K& r6 @3 o2 p运行后,可以再次运行9 a' K" {8 `5 e; f$ A2 w
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
; [) L4 |8 m0 w来确认是否将僵尸进程杀死
- N5 U/ B5 M0 }- ^如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12534,那么我们就运行  i& W0 h- D$ g8 h; G3 Y. {) D" g
kill -HUP 12534来解决问题
 楼主| 发表于 2019-7-5 23:50:52 | 显示全部楼层
检查当前僵尸进程信息
7 q8 j' X: p: ?. T! k; `
/ z6 [0 u3 k* c/ y  D0 aps -ef | grep defunct | grep -v grep | wc -l
  a) Z1 m! v6 S+ C查看TOP前两行信息
5 k( y, u3 ~1 c3 R# z  J9 ^0 e- j. T# }0 g, k: k5 f
top | head -2
' Y8 M  G; z' J/ X; F& _; n直接杀死进程( T5 R$ a2 C* [2 g

0 P; {* }5 C0 s ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'
 楼主| 发表于 2019-7-5 23:51:30 | 显示全部楼层
/* zombie.c */) v4 M! @" X9 ~' o
#include <sys/types.h>
) N9 K- w6 u/ f3 p#include <unistd.h>  main()
$ X1 e* `$ X9 g4 k& W- `! L" `3 `* Y{
1 G: n0 r8 H/ J6 t: R- z0 b9 e' ^    pid_t pid;
9 P6 G2 d+ c1 B( h# H- Q    pid=fork();; {% f3 w8 a+ Q& a9 i
    if(pid<0) {
3 s$ u6 S: I& O7 x: N9 V/* 如果出错 */
6 k5 b- d: }+ M3 [6 C. K0 L * n6 C5 d! W; q2 K
        printf("error occurred!\n");
4 n' N0 \% {8 v/ X& J8 F: X    }else if(pid==0){
" P+ K) N8 i) a8 t# C7 a/* 如果是子进程 */
, L0 R. z: r0 O* u" ?- ?" l
0 H; d/ \- i) n& T, K* Z9 ^        exit(0);
. W" |; {, w0 N    }else{
& n6 p) N5 D/ U/* 如果是父进程 */& p6 {0 @- x1 r+ |) b
. @% O& C) M% y% z  J( n/ i6 @8 P9 k/ _/ ]
        sleep(60); + Y* Z" S& o5 I+ F' ^
/* 休眠60秒 */- ~2 a( Z, _# _( Z0 l$ t3 I9 X+ b

8 y( V: `+ k' Y- _        wait(NULL);2 W! y8 b. X5 \) `
/* 收集僵尸进程 */7 u/ U. L, k1 D7 n
    }1 P$ h8 ~3 M- G4 }+ |5 w! \
}
 楼主| 发表于 2019-7-5 23:52:59 | 显示全部楼层
编译这个程序:! @( R8 \1 [) k2 K

5 b4 z4 g7 V5 p' e# Q1 S$ cc zombie.c -o zombie  B/ d0 F2 P0 d+ a+ i
4 P" A( T2 t" W) K' R
后台运行程序,以使我们能够执行下一条命令
9 C+ h, m2 ^* L1 k" B$ ./zombie &
" y( o: y) P  i& u2 s5 P[1] 12172 a* l2 s6 w1 W0 I0 m: {7 x
$ ps -ax5 l7 D' W3 ]. m4 _% R
... ...3 y6 ~  N# o7 n+ s2 c
1137   pts/0   S   0:00   -bash
- K% H* j/ ]) E3 F. c4 ?% z# k1217   pts/0   S   0:00   ./zombie1 `8 M' H2 n, ]
1218   pts/0   Z   0:00   [zombie]
7 l7 s3 w  [& d& ]8 S1578   pts/0   R   0:00   ps   -ax
1 _$ {7 ^$ h* k' F; T* I
+ I4 ^/ r$ h  j& B4 P. G' E其中的”Z”就是僵尸进程的标志,它表示1218号进程现在就是一个僵尸进程。
$ `! s# n# Q& y# o9 k
1 @; i0 O$ `8 @4 b收集Zombie进程的信息,并终结这些僵尸进程,需要我们在父进程中使用waitpid调用和wait调用。这两者的作用都是收集僵尸进程留下的信息,同时使这个进程彻底消失。* r1 n" |  A$ e; [4 ~
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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