在Linux系统中查看进程及杀死僵尸进程的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Linux系统中查看进程及杀死僵尸进程的方法相关的知识,希望对你有一定的参考价值。

参考技术A   ps
命令
  ps
命令就是最根本相应情况下也是相当强大地进程查看命令.运用该命令可以确定有哪些进程正在运行和运行地状态、
进程
是否结束、进程有没有僵死、哪些进程占用了过多地资源等等.总之大部分信息均为可以通过执行该命令得到地.
  ps
命令及其参数
  ps
命令最经常使用地还是用于监控后台进程地工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设
  备进行通信地,所以如果需要检测其情况,便可以运用
ps
命令了.
  该命令语法格式如下:
  ps
[选项]
  -e
显示所有进程,环境变量
  -f
全格式
  -h
不显示标题
  -l
长格式
  -w
宽输出
  a
  显示终端上地所有进程,包括其他用户地进程
  r
  只显示正在运行地进程
  x
  显示没有控制终端地进程
  O[+|-]
k1
[,[+|-]
k2
[,…]]
根据
SHORT
KEYS、k1、k2
中快捷键指定地多级排序顺序显示进程列表.
  对于
ps
地不同格式都存在着默认地顺序指定.这些默认顺序可以被用户地指定所覆盖.在这里面“+”字符是可选地,“-”
字符是倒转指定键地方向.
  pids
只列出进程标识符,之间运用逗号分隔.该进程列表必须在命令行参数地最后一个选项后面紧接着给出,中间不能插入
空格.比如:ps
-f1,4,5.
  以下介绍长命令行选项,这些选项都运用“--”开头:
  --sort
X[+|-]
key
[,[+|-]
key
[,…]]

SORT
KEYS
段中选一个多字母键.“+”字符是可选地,因为默认地方向就是按
数字升序或者词典顺序.比如:
ps
-jax
-sort=uid,-ppid,+pid.
  --help
显示帮助信息.
  --version
显示该命令地版本信息.
  在前面地选项说明中提到了排序键,接下来对排序键作进一步说明.需要注意地是排序中运用地值是
ps
运用地内部值,并非
仅用于某些输出格式地伪值.排序键列表见表
4-3.
  排序键列表
  c
  cmd
  可执行地简单名称
  C
  cmdline
  完整命令行
  f
  flags
  长模式标志
  g
  pgrp
  进程地组
ID
  G
  tpgid
  控制
tty
进程组
ID
  j
  cutime
  累计用户时间
  J
  cstime
  累计系统时间
  k
  utime
  用户时间
  K
  stime
  系统时间
  m
  min_flt
  次要页错
  查找Zombie进程
  首先,当桌面程序卡死的时候,你可以尝试进入其他tty终端。切换方式:ctrl
+
alt
+
[1,2,3,4,5,6,7],7是桌面终端
  其次,你可以使用top命令查看当前是否有Zombie进程
  从上图可以看到僵尸进程数,num
zombie,num大于0,则代表系统存在僵尸进程
  最后,利用ps命令查找Zombie进程
  复制代码
  代码如下:
  ps
-A
-ostat,ppid,pid,cmd
|
grep
-e
'^[zZ]'
  示例

  杀死Zombie进程
  直接kill
-9
Zombiepid是没有作用的,原因是:Zombie表示进程已经退出,想要清理这样的进程,需要清除其父进程或者等很长时间后内核将其清除
  复制代码
  代码如下:
  kill
-HUP
ppid
  后记
  不知道为什么我注销之后重新登录还有这个僵尸进程,怀疑是否是LightDM的bug,不过Ubuntu12.04
desktop
display
manager就是LightDM,所以kill
-HUP至少起到了注销的作用,不用重启了

【zombie】如何查看并杀死僵尸进程?

参考技术A In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it is called a zombie.

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid), 那么它将变成一个僵尸进程.  在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。

我们可以用top命令来查看服务器当前是否有僵尸进程,在下图中可以看到僵尸进程数的提示,如果数字大于0,那么意味着服务器当前存在有僵尸进程:

#ps -ef | grep defunct

#ps -ef | grep defunct | grep -v grep | wc -l

# ps -ef | grep defunct | grep -v grep | awk 'print "kill -18 " $3'

一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。就是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,而此时,尽管对它的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。

我们用ps和grep命令寻找僵尸进程:

# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

命令注解:

-A 参数列出所有进程

-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数

因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程

运行结果参考如下

Z 12334 12339 /path/cmd

这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程

运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死。

如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行kill -HUP 12334

一条简单的命令,直接查找僵死进程,然后将父进程杀死

#  ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk 'print $2' | xargs kill -9

# ps -e -o ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9

# kill -HUP  $(ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’print $2’)

处理SIGCHLD信号并不是必须的,但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。

如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。

在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。

这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

或者用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程!

以上是关于在Linux系统中查看进程及杀死僵尸进程的方法的主要内容,如果未能解决你的问题,请参考以下文章

Linux系列:查看并杀死僵尸进程,自动告警方法

Linux系列:查看并杀死僵尸进程,自动告警方法

Linux上寻找并杀死僵尸进程

如何查找和杀掉Linux中的僵尸进程?

ubuntu Linux怎么解决僵尸进程

僵尸进程