1. kill
作用:根据进程号杀死进程
用法: kill [信号代码] 进程ID
root@loris-desktop:/# ps -ef | grep sendmail
smmsp 14354 14337 0 00:08 pts/1 00:00:00 sendmail start
smmsp 14356 3154 0 00:08 pts/0 00:00:00 sendmail -s
smmsp 14359 3154 0 00:09 pts/0 00:00:00 sendmail start
smmsp 14360 14337 0 00:09 pts/1 00:00:00 sendmail state
root 17723 15753 0 01:08 pts/2 00:00:00 vim sendmail.mc
root 19022 1 0 01:26 ? 00:00:03 gedit /etc/mail/sendmail.mc
root 20674 15753 0 01:55 pts/2 00:00:00 grep sendmail
root@loris-desktop:/# kill -9 14354
注意:kill -9 来强制终止退出
特殊用法:
kill -STOP [pid]
发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。
kill -CONT [pid]
发送SIGCONT (19,18,25)重新开始一个停止的进程。
kill -KILL [pid]
发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。
kill -9 -1
终止你拥有的全部进程。
2. killall
作用:通过程序的名字,直接杀死所有进程
用法:killall 正在运行的程序名
举例:
root@loris-desktop:/# ps -ef | grep sendmail
smmsp 14354 14337 0 00:08 pts/1 00:00:00 sendmail start
smmsp 14356 3154 0 00:08 pts/0 00:00:00 sendmail -s
smmsp 14359 3154 0 00:09 pts/0 00:00:00 sendmail start
smmsp 14360 14337 0 00:09 pts/1 00:00:00 sendmail state
root 17723 15753 0 01:08 pts/2 00:00:00 vim sendmail.mc
root 19022 1 0 01:26 ? 00:00:03 gedit /etc/mail/sendmail.mc
root 20683 15753 0 01:59 pts/2 00:00:00 grep sendmail
root@loris-desktop:/# killall -9 sendmail
root@loris-desktop:/# ps -ef | grep sendmail
root 17723 15753 0 01:08 pts/2 00:00:00 vim sendmail.mc
root 19022 1 0 01:26 ? 00:00:03 gedit /etc/mail/sendmail.mc
root 20686 15753 0 01:59 pts/2 00:00:00 grep sendmail
root@loris-desktop:/# killall -9 sendmail
注意:该命令可以使用 -9 参数来强制杀死进程
3. pkill
作用:通过程序的名字,直接杀死所有进程
用法:#pkill 正在运行的程序名
举例:
root@loris-desktop:/# ps -ef | grep sendmail
root 17723 15753 0 01:08 pts/2 00:00:00 vim sendmail.mc
root 19022 1 0 01:26 ? 00:00:03 gedit /etc/mail/sendmail.mc
root 21480 15753 0 02:03 pts/2 00:00:00 grep sendmail
root@loris-desktop:/# pkill sendmail
4. xkill
作用:杀死桌面图形界面的程序。
应用情形实例:firefox出现崩溃不能退出时,点鼠标就能杀死firefox 。
当xkill运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就OK了。
如果您想终止xkill ,就按右键取消;
调用方法:
[root@localhost ~]# xkill
◆编者注:
KILLALL(Section: User (1)/Updated: 1999年9月7日)
-----------------------------------------------
NAME (名称)
killall - 以名字方式来杀死进程
SYNOPSIS (总览)
killall [-egiqvw] [-signal] name ...
killall -l
killall -V
DESCRIPTION (描述)
killall 发送一条信号给所有运行任意指定命令的进程. 如果没有指定信号名, 则发送SIGTERM.。
信号可以以名字 (如 -HUP ) 或者数字 (如 -1 ) 的方式指定. 信号 0 (检查进程是否存在)只能以数字方式指定。
如果命令名包括斜杠 (/), 那么执行该特定文件的进程将被杀掉, 这与进程名无关。
如果对于所列命令无进程可杀, 那么 killall 会返回非零值. 如果对于每条命令至少杀死了一个进程, killall 返回 0。Killall 进程决不会杀死自己 (但是可以杀死其它 killall 进程)。
OPTIONS (选项)
-e
对于很长的名字, 要求准确匹配. 如果一个命令名长于 15 个字符, 则可能不能用整个名字 (溢出了). 在这种情况下, killall 会杀死所有匹配名字前 15 个字符的所有进程. 有了 -e 选项,这样的记录将忽略. 如果同时指定了 -v 选项, killall 会针对每个忽略的记录打印一条消息。
-g
杀死属于该进程组的进程. kill 信号给每个组只发送一次, 即使同一进程组中包含多个进程。
-i
交互方式,在杀死进程之前征求确认信息。
-l
列出所有已知的信号名。
-q
如果没有进程杀死, 不会提出抱怨。
-v
报告信号是否成功发送。
-V
显示版本信息。
-w
等待所有杀的进程死去. killall 会每秒检查一次是否任何被杀的进程仍然存在, 仅当都死光后才返回. 注意: 如果信号被忽略或没有起作用, 或者进程停留在僵尸状态, killall 可能会永久等待。
FILES(相关文件)
/proc proc文件系统的存在位置。
KNOWN bugS (已知 BUGS)
以文件方式杀死只对那些在执行时一直打开的可执行文件起作用, 也即, 混杂的可执行文件不能够通过这种方式杀死。
要警告的是输入 killall name 可能不会在非 Linux 系统上产生预期的效果, 特别是特权用户执行时要小心。
在两次扫描的间隙, 如果进程消失了而被代之以一个有同样 PID 的新进程, killall -w 侦测不到。
二.Linux的kill命令与信号控制
信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件做出反应或者按照日程安排执行任务的后台服务。一个程序必须有建在其中的信号处理程序用于捕获和应答信号。在LINUX中的signal参考指南解释了各种不同信号和这些信号的用途。信号是由“kill”命令发出的。kill -l命令可以显示一个可用信号列表及其编号。
所有的守护程序和进程都有一个进程ID(PID),例如使用ps命名所显示的内容:
$ 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资源消灭一个客户程序
(完)