首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux 查看过程和终止进程

2012-07-08 
linux 查看进程和终止进程  $?ps?aux   USER?PID?%CPU?%MEM?TTY?STAT?COMMAND   root?1?0.0?0.1???S?init?

linux 查看进程和终止进程
  $?ps?aux
  USER?PID?%CPU?%MEM?TTY?STAT?COMMAND
  root?1?0.0?0.1???S?init?[2]
  105?7783?0.0?0.2???Ss?/usr/bin/dbus-daemon?--system
  hal?7796?0.0?0.7???Ss?/usr/sbin/hald
  postfix?7957?0.0?0.2???S?qmgr?-l?-t?fifo?-u?-c
  nagios?8371?0.0?0.2???SNs?/usr/sbin/nagios?/etc/nagios/nagios.cfg

  这个输出是经过简化的。你在系统中可以看到更多的行和栏目。如果某些进程消耗了你的全部CPU或者内存,你可以在这个输出的%CPU和%MEM列中发现它们。找到失控的进程的一种更快捷的方法是使用top命令,因为按照默认的设置,使用占用CPU资源最多的进程在最上面显示。我们可以使用一条“yes”命令来测试一下:

?

$?yes?carla?is?teh?awesum

  这个命令将以很高的速度反复显示“carla is teh awesum”,直到你停止它运行。这将使你的CPU使用率达到警戒线。

?

  $?top
  ...
  PID?USER?PR?NI?VIRT?RES?SHR?S?%CPU?%MEM?TIME+?COMMAND
  12144?carla?25?0?31592?17m?13m?R?93.4?3.5?0:50.26?konsole
  22236?carla?15?0?2860?468?400?S?4.3?0.1?0:00.97?yes

分析一下这个结果,你会发现一些有趣的事,你会发现,占用CPU最多的程序是konsole虚拟终端程序,而不是“yes”命令,这是因为“yes”命令是在konsole终端程序中运行的。如果在一个“真正的”控制台(按Ctrl+alt+f2键)中运行同样的命令序列,你将看到“yes”命令被排在第一位。

  有许多停止“yes”命令运行的方式。如果你要回到运行它的shell中,按CTRL+c键就可以了。或者你可以在另一个shell中用“kill”命令停止“yes”命令的运行,Kill命令后面跟PID或者命令名称,如下如示:

?

$?kill?22236

  或者

?

$?killall?yes

  按CTRL+c键发出一个SIGINT(信号2),这个信号是键盘要求取得控制权的中断信号。kill和killall这两个命令按照默认的设置都发出一个SIGTERM信号(编号15)。程序中可以设置对SIGTERM信号(15)是捕捉或者忽略,或者以不同的方式解释。因此,如果你的程序对于KILL命令的反应与你预期不同,很可能是被KILL的目标程序的问题。

  终止一个父进程通常也终止了它的子进程。不过,情况并不总是如此。你知道子进程是什么吗?使用ps命令加上-f选项就可以看到,如下所示:

?

  $?ps?axf
  22371???R?2:35?_?konsole?[kdeinit]
  22372?pts/3?Ss?0:00?|?_?/bin/bash
  24322?pts/3?S+?0:00?|?|?_?yes?carla?is?teh?awesum
  22381?pts/4?Rs?0:00?|?_?/bin/bash
  24323?pts/4?R+?0:00?|?|?_?ps?axf

  现在,回到SIGHUP的话题

  SIGHUP的发音是“sig-hup”,是signal?hangup的缩写,含义是“中止信号”。你如何发送一个SIGHUP信号呢?这里有几种方式:

?

#?kill?-HUP?[pid]

?

#?killall?-HUP?[process-name]

?

#?kill?-1?[pid]

?

#?killall?-1?[process-name]

  因此,你可以使用PID或者名称,信号名称或者号码。那么为什么要这样做而不使用/etc/init.d/foo命令重新启动呢?使用它们自己的init(初始化)文件来控制服务是优先选择的方式,因为这些文件通常包含健全和错误检查以及额外的功能。使用“kill”命令和信号的主要原因是尽可能明确地终止挂起和失控的进程,而不必重新启动或者登出。

终止进程

  正如你在关于信号的man page中所看到的,有十几种控制进程的方法。下面是一些常用的方法:

  kill -STOP [pid]

  发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。

  kill -CONT [pid]

  发送SIGCONT (19,18,25)重新开始一个停止的进程。

  kill -KILL [pid]

  发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。

  kill -9 -1

  终止你拥有的全部进程。

  SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略,但是,其它的信号可以。所以这是你的终极武器。

  Bash shell的Kil命令l

  Bash外壳包含一个内置的kill命令,当执行下面命令:

?

  $?type?-all?kill
  kill?is?a?shell?built-in
  kill?is?/bin/kill

  命令的结果表明有两个kill命令,一个是BASH的内置命令,另一个是/bin/kill可执行程序。一般来说这两个命令不太可能遇到冲突的情况,不过,如果你确实遇到了kill命令行为异常时,你可以明确的指定/bin/kill命令。

  你一定要进一步查阅下面的资源中列出的参考资源来了解Linux中kill的妙用,因为这是你进入维护Linux系统领域的门票。这些知识能够让你像做外科手术一样对系统进行维护,而不用在遇到问题时每一次都重新启动系统,就像我们知道的某些蹩脚的 操作系统那样。

  资源

  Linux Cookbook一书的第七章“开始和终止Linux”

  bash (1) - GNU Bourne-Again Shell

  yes (1) - 在被终止前反复打印字符

  signal (7) - 可用信号列表

  ps (1) - 报告当前进程的快照

  kill (1) - 向一个进程发出信号

  killall (1) - 按名字消灭进程

  pkill (1) - 根据名字和其它属性查看或者发出进程信号

  skill (1) - 发送一个信号或者报告进程状态

  xkill (1) - 按照X资源消灭一个客户程序

热点排行