一
.
终止进程的工具
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
资源消灭一个客户程序
作者
***的博客