linux kill终止进程
一. 终止进程的工具 kill 、killall、pkill、xkill
终止一个进程或终止一个正在运行的程序,一般是通过kill、killall、pkill、xkill等进行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。
另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用这些工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的危险。比如mysql服务器最好是按其正常的程序关闭,而不是用pkillmysqld或killallmysqld这样危险的动作;当然对于占用资源过多的数据库子进程,我们应该用kill来杀掉。
1.kill
kill的应用是和ps或pgrep命令结合在一起使用的;
kill的用法:
kill[信号代码]进程ID
注:信号代码可以省略;我们常用的信号代码是-9,表示强制终止;
举例:
[root@localhost~]#psauxf|grephttpd
root49390.00.05160708pts/3S+13:100:00\_grephttpd
root48300.11.32423210272?Ss13:020:00/usr/sbin/httpd
apache48330.00.6243644932?S13:020:00\_/usr/sbin/httpd
apache48340.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48350.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48360.00.6243644928?S13:020:00\_/usr/sbin/httpd
apache48400.00.6243644928?S13:020:00\_/usr/sbin/httpd
我们查看httpd服务器的进程;您也可以用pgrep-lhttpd来查看;
我们看上面例子中的第二列,就是进程PID的列,其中4830是httpd服务器的父进程,从4833-4840的进程都是它4830的子进程;如果我们杀掉父进程4830的话,其下的子进程也会跟着死掉;
[root@localhost~]#kill4840注:杀掉4840这个进程;
[root@localhost~]#ps-auxf|grephttpd注:查看一下会有什么结果?是不是httpd服务器仍在运行?
[root@localhost~]#kill4830注:杀掉httpd的父进程;
[root@localhost~]#ps-aux|grephttpd注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?
对于僵尸进程,可以用kill-9来强制终止退出;
比如一个程序已经彻底死掉,如果kill不加信号强度是没有办法退出,最好的办法就是加信号强度-9,后面要接杀父进程;比如;
[root@localhost~]#psaux|grepgaim
beinan50319.02.310499617484?S13:230:01gaim
root50360.00.05160724pts/3S+13:240:00grepgaim
或[root@localhost~]#pgrep-lgaim
5031gaim
[root@localhost~]#kill-95031
2.killall
killall通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。
用法:killall正在运行的程序名
killall也和ps或pgrep结合使用,比较方便;通过ps或pgrep来查看哪些程序在运行;
举例:
[root@localhostbeinan]#pgrep-lgaim
2979gaim
[root@localhostbeinan]#killallgaim
3.pkill
pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。
应用方法:
#pkill正在运行的程序名
举例:
[root@localhostbeinan]#pgrep-lgaim
2979gaim
[root@localhostbeinan]#pkillgaim
4.xkill
xkill是在桌面用的杀死图形界面的程序。比如当firefox出现崩溃不能退出时,点鼠标就能杀死firefox。当xkill运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就OK了。如果您想终止xkill,就按右键取消;
xkill调用方法:
[root@localhost~]#xkill
二.Linux的kill命令与信号控制
信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件做出反应或者按照日程安排执行任务的后台服务。一个程序必须有建在其中的信号处理程序用于捕获和应答信号。在LINUX中的signal参考指南解释了各种不同信号和这些信号的用途。信号是由“kill”命令发出的。kill-l命令可以显示一个可用信号列表及其编号。
所有的守护程序和进程都有一个进程ID(PID),例如使用ps命名所显示的内容:
$psaux
USERPID%CPU%MEMTTYSTATCOMMAND
root10.00.1?Sinit[2]
10577830.00.2?Ss/usr/bin/dbus-daemon--system
hal77960.00.7?Ss/usr/sbin/hald
postfix79570.00.2?Sqmgr-l-tfifo-u-c
nagios83710.00.2?SNs/usr/sbin/nagios/etc/nagios/nagios.cfg
这个输出是经过简化的。你在系统中可以看到更多的行和栏目。如果某些进程消耗了你的全部CPU或者内存,你可以在这个输出的%CPU和%MEM列中发现它们。找到失控的进程的一种更快捷的方法是使用top命令,因为按照默认的设置,使用占用CPU资源最多的进程在最上面显示。我们可以使用一条“yes”命令来测试一下:
$yescarlaistehawesum
这个命令将以很高的速度反复显示“carlaistehawesum”,直到你停止它运行。这将使你的CPU使用率达到警戒线。
$top
...
PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND
12144carla2503159217m13mR93.43.50:50.26konsole
22236carla1502860468400S4.30.10:00.97yes
分析一下这个结果,你会发现一些有趣的事,你会发现,占用CPU最多的程序是konsole虚拟终端程序,而不是“yes”命令,这是因为“yes”命令是在konsole终端程序中运行的。如果在一个“真正的”控制台(按Ctrl+alt+f2键)中运行同样的命令序列,你将看到“yes”命令被排在第一位。
有许多停止“yes”命令运行的方式。如果你要回到运行它的shell中,按CTRL+c键就可以了。或者你可以在另一个shell中用“kill”命令停止“yes”命令的运行,Kill命令后面跟PID或者命令名称,如下如示:
$kill22236
或者
$killallyes
按CTRL+c键发出一个SIGINT(信号2),这个信号是键盘要求取得控制权的中断信号。kill和killall这两个命令按照默认的设置都发出一个SIGTERM信号(编号15)。程序中可以设置对SIGTERM信号(15)是捕捉或者忽略,或者以不同的方式解释。因此,如果你的程序对于KILL命令的反应与你预期不同,很可能是被KILL的目标程序的问题。
终止一个父进程通常也终止了它的子进程。不过,情况并不总是如此。你知道子进程是什么吗?使用ps命令加上-f选项就可以看到,如下所示:
$psaxf
22371?R2:35_konsole[kdeinit]
22372pts/3Ss0:00|_/bin/bash
24322pts/3S+0:00||_yescarlaistehawesum
22381pts/4Rs0:00|_/bin/bash
24323pts/4R+0:00||_psaxf
现在,回到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”命令和信号的主要原因是尽可能明确地终止挂起和失控的进程,而不必重新启动或者登出。
终止进程
正如你在关于信号的manpage中所看到的,有十几种控制进程的方法。下面是一些常用的方法:
kill-STOP[pid]
发送SIGSTOP(17,19,23)停止一个进程,而并不消灭这个进程。
kill-CONT[pid]
发送SIGCONT(19,18,25)重新开始一个停止的进程。
kill-KILL[pid]
发送SIGKILL(9)强迫进程立即停止,并且不实施清理操作。
kill-9-1
终止你拥有的全部进程。
SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略,但是,其它的信号可以。所以这是你的终极武器。
Bashshell的Kil命令l
Bash外壳包含一个内置的kill命令,当执行下面命令:
$type-allkill
killisashellbuilt-in
killis/bin/kill
命令的结果表明有两个kill命令,一个是BASH的内置命令,另一个是/bin/kill可执行程序。一般来说这两个命令不太可能遇到冲突的情况,不过,如果你确实遇到了kill命令行为异常时,你可以明确的指定/bin/kill命令。
你一定要进一步查阅下面的资源中列出的参考资源来了解Linux中kill的妙用,因为这是你进入维护Linux系统领域的门票。这些知识能够让你像做外科手术一样对系统进行维护,而不用在遇到问题时每一次都重新启动系统,就像我们知道的某些蹩脚的操作系统那样。
资源
LinuxCookbook一书的第七章“开始和终止Linux”
bash(1)-GNUBourne-AgainShell
yes(1)-在被终止前反复打印字符
signal(7)-可用信号列表
ps(1)-报告当前进程的快照
kill(1)-向一个进程发出信号
killall(1)-按名字消灭进程
pkill(1)-根据名字和其它属性查看或者发出进程信号
skill(1)-发送一个信号或者报告进程状态
xkill (1) - 按照X资源消灭一个客户程序