. 终止进程的工具 kill killall pkill xkill

终止一个进程或终止一个正在运行的程序,一般是通过 kill killall pkill xkill 等进行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。

另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用这些工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的危险。比如 mysql 服务器最好是按其正常的程序关闭,而不是用 pkill mysqld killallmysqld 这样危险的动作;当然对于占用资源过多的数据库子进程,我们应该用 kill 来杀掉。

1. kill

kill
的应用是和 ps pgrep 命令结合在一起使用的;

kill
的用法:

kill
[信号代码] 进程 ID

注:信号代码可以省略;我们常用的信号代码是 -9 ,表示强制终止;

举例:

[root@localhost ~]# ps auxf |grep httpd

root 4939 0.0 0.0 5160 708 pts/3 S+ 13:100:00 _ grep httpd

root 4830 0.1 1.3 24232 10272 ? Ss 13:020:00 /usr/sbin/httpd

apache 4833 0.0 0.6 24364 4932 ? S 13:020:00 _ /usr/sbin/httpd

apache 4834 0.0 0.6 24364 4928 ? S 13:020:00 _ /usr/sbin/httpd

apache 4835 0.0 0.6 24364 4928 ? S 13:020:00 _ /usr/sbin/httpd

apache 4836 0.0 0.6 24364 4928 ? S 13:020:00 _ /usr/sbin/httpd

apache 4840 0.0 0.6 24364 4928 ? S 13:020:00 _ /usr/sbin/httpd
我们查看 httpd 服务器的进程;您也可以用 pgrep -l httpd 来查看;


我们看上面例子中的第二列,就是进程 PID 的列,其中 4830 httpd 服务器的父进程,从 4833 4840 的进程都是它 4830 的子进程;如果我们杀掉父进程 4830 的话,其下的子进程也会跟着死掉;

[root@localhost ~]# kill 4840
注:杀掉 4840 这个进程;

[root@localhost ~]# ps -auxf |grep httpd
注:查看一下会有什么结果?是不是 httpd 服务器仍在运行?

[root@localhost ~]# kill 4830
注:杀掉 httpd 的父进程;

[root@localhost ~]# ps -aux |grep httpd
注:查看 httpd 的其它子进程是否存在, httpd 服务器是否仍在运行?


对于僵尸进程,可以用 kill -9 来强制终止退出;


比如一个程序已经彻底死掉,如果 kill 不加信号强度是没有办法退出,最好的办法就是加信号强度 -9 ,后面要接杀父进程;比如;

[root@localhost ~]# ps aux |grep gaim

beinan 5031 9.0 2.3 104996 17484 ? S 13:230:01 gaim

root 5036 0.0 0.0 5160 724 pts/3 S+ 13:240:00 grep gaim

[root@localhost~]# pgrep -l gaim

5031 gaim

[root@localhost ~]# kill -9 5031

2. killall

killall
通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。

用法: killall 正在运行的程序名

killall
也和 ps pgrep 结合使用,比较方便;通过 ps pgrep 来查看哪些程序在运行;

举例:

[root@localhost beinan]# pgrep -l gaim

2979 gaim

[root@localhost beinan]# killall gaim

3. pkill

pkill
killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用 kill 来杀掉。

应用方法:

#pkill
正在运行的程序名


举例:

[root@localhost beinan]# pgrep -l gaim

2979 gaim

[root@localhost beinan]# pkill gaim

4. xkill

xkill
是在桌面用的杀死图形界面的程序。比如当 firefox 出现崩溃不能退出时,点鼠标就能杀死 firefox 。当 xkill 运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就 OK 了。如果您想终止 xkill ,就按右键取消;

xkill
调用方法:

[root@localhost ~]# xkill

.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 %MEMTIME+ COMMAND

12144 carla 25 0 31592 17m 13m R 93.4 3.50:50.26 konsole

22236 carla 15 0 2860 468 400 S 4.3 0.10: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 tehawesum

22381 pts/4 Rs 0:00 | _ /bin/bash

24323 pts/4 R+ 0:00 | | _ ps axf

现在,回到 SIGHUP 的话题

SIGHUP
的发音是 “sig-hup” ,是 signalhangup 的缩写,含义是 中止信号 。你如何发送一个 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 资源消灭一个客户程序

作者 ***的博客