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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-7-5 23:50:05 | 显示全部楼层 |阅读模式
可以用ps和grep命令寻找僵尸进程1 \% F' P* \, _+ ^  L) d6 a
) j. @! |2 ~7 N7 U6 n9 O
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'; {) @8 O* B, X9 X, Q6 }

% }& l% W/ e: p" y' p命令选项说明:* ^" H/ S& f: M  ~
( p$ z' ^! k2 N. `
-A 参数列出所有进程
- I! M6 S% d9 a4 y1 o* s) |2 B-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数9 i5 V; }" @* k( B8 m
因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程4 c' S7 H2 K2 K$ x% L
3 n8 Y3 O4 M; c$ o& b# g- g! l
运行结果参考如下
* O9 L2 s/ U: }Z 12534 12339 /path/cmd
; |" y3 Q; N: T! h' W8 u这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程. S7 i* E& F+ B$ C6 f, V, e
9 g" ?5 T# A, O, x2 w( j) n
运行后,可以再次运行
4 Z8 Z  N) J+ a1 pps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 6 e) B, |7 i$ E" V0 l( ~
来确认是否将僵尸进程杀死. R9 \$ E% B7 Z) X, G, }" q
如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12534,那么我们就运行* U) ?/ Y* D2 F  l! J4 o4 d
kill -HUP 12534来解决问题

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-7-5 23:50:52 | 显示全部楼层
检查当前僵尸进程信息
9 `: T, b* L% ~, k! ?
; V) P, @( R* N% s$ T1 a7 Sps -ef | grep defunct | grep -v grep | wc -l7 c0 u0 p: H" }2 {6 L; b0 x
查看TOP前两行信息. v3 W( X$ u  m( |. d' j' Z! h) o2 l

7 q, {4 g* W, @6 K0 y/ Wtop | head -2
- d( [; r7 m, u& H" z" ^) a* L# x直接杀死进程: G) D9 M7 C, w9 `& H/ O
* t2 P% Y* K% z5 R, }; t6 a
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 */2 T3 g( A( ]) w2 t
#include <sys/types.h>3 u" b/ z+ K  t% V
#include <unistd.h>  main()+ b  ~! ~2 ~7 f
{1 d, p- x$ m$ b; F
    pid_t pid;
% g8 G- n- a- k) l2 G, B    pid=fork();
& C$ T: A0 F" P, J" Z, G0 n( X    if(pid<0) {
& ?+ h6 P9 o1 w2 W7 @& T8 J9 w3 t9 I/* 如果出错 */, q- ~. B! z6 h% X  W3 n
+ s3 k, X$ o$ n  g9 K1 J
        printf("error occurred!\n");3 Y0 L- g0 W* N6 k: Z5 [3 ]$ g% F
    }else if(pid==0){
6 T& u0 b& d. R/* 如果是子进程 */
3 l' O5 _  W# ?" p# M( I
1 p4 B! i$ b$ z% U+ |        exit(0);5 `. E' z0 ^" `& r
    }else{   T2 u5 e( b! I$ z( `1 E; C
/* 如果是父进程 */+ z/ v6 z. `2 L' u. R9 p( F

3 _* u  c) W2 D& F! s5 ]        sleep(60); - ]" i4 _, Y# E6 x4 q& b
/* 休眠60秒 *// t* ~. C' U3 K6 T

. j6 I$ d9 C: M, h- z$ O        wait(NULL);
) L% H7 c& P5 J/ _# w# O/* 收集僵尸进程 */- O" q6 E" s& `" ]3 \& k0 x
    }: ~4 e+ y# N# @: U2 w* ?9 M6 r
}

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2019-7-5 23:52:59 | 显示全部楼层
编译这个程序:' A3 L6 S6 A8 X9 O# a

- L! t* }/ z+ ]9 K, ?* p- a& [$ cc zombie.c -o zombie
; y+ @1 M. Q& n5 }6 I1 M; n: l
( j& {6 c! x" V. X9 _+ g2 G8 h后台运行程序,以使我们能够执行下一条命令
# U4 y5 K3 j' {9 k8 B" m$ ./zombie &
% r2 ]5 X( ~- w& k% {[1] 1217: S0 _4 c% H+ A4 w) q" Y" Z% {
$ ps -ax
8 d+ k3 O% c! v... ...  C8 H8 }6 O3 N- s) O
1137   pts/0   S   0:00   -bash) z5 i9 x. d  S% d- s' K4 i9 {
1217   pts/0   S   0:00   ./zombie
# M$ L* u# |, s8 C9 u9 d1218   pts/0   Z   0:00   [zombie]
7 r' [8 w% H& ~* }1578   pts/0   R   0:00   ps   -ax7 }+ q/ i7 N" Q, L4 X
0 i6 M9 P, a  s- T
其中的”Z”就是僵尸进程的标志,它表示1218号进程现在就是一个僵尸进程。
( K" `+ C. }' q% h# Q/ W$ R$ i4 X5 e0 Q; D
收集Zombie进程的信息,并终结这些僵尸进程,需要我们在父进程中使用waitpid调用和wait调用。这两者的作用都是收集僵尸进程留下的信息,同时使这个进程彻底消失。: x4 p8 {) D, c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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