Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。工作原理是向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作,通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pgrep/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。
一、获取进程PID
1、ps -ef
1
2
3
4
5
6
7
<code>[root@justin conf]</code><code># ps -ef</code>
<code>UID PID PPID C STIME TTY TIME CMD</code>
<code>root 1 0 0 14:09 ? 00:00:02 </code><code>/sbin/init</code>
<code>root 2 0 0 14:09 ? 00:00:00 [kthreadd]</code>
<code>root 3 2 0 14:09 ? 00:00:00 [migration</code><code>/0</code><code>]</code>
<code>root 4 2 0 14:09 ? 00:00:00 [ksoftirqd</code><code>/0</code><code>]</code>
<code>root 5 2 0 14:09 ? 00:00:00 [migration</code><code>/0</code><code>]</code>
2、ps -aux
<code>[root@justin conf]</code><code># ps aux</code>
<code>USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND</code>
<code>root 1 0.4 0.1 2872 1424 ? Ss 14:09 0:02 </code><code>/sbin/init</code>
<code>root 2 0.0 0.0 0 0 ? S 14:09 0:00 [kthreadd]</code>
<code>root 3 0.0 0.0 0 0 ? S 14:09 0:00 [migration</code><code>/0</code><code>]</code>
<code>root 4 0.0 0.0 0 0 ? S 14:09 0:00 [ksoftirqd</code><code>/0</code><code>]</code>
3、精确查找进程PID
3.1通过管道符、grep
<code>[root@localhost ~]</code><code># ps aux|grep firefox</code>
<code>root 2276 3.4 5.7 318708 59268 ? Sl 04:57 0:02 </code><code>/usr/lib/firefox-3</code><code>.6.18</code><code>/firefox-bin</code>
<code>root 2344 0.0 0.0 4356 728 pts</code><code>/0</code> <code>S+ 04:58 0:00 </code><code>grep</code> <code>firefox</code>
<code>[root@localhost ~]</code><code>#</code>
3.2、pgrep
pgrep的p表明了这个命令是专门用于进程查询的grep
<code>[root@localhost ~]</code><code># pgrep firefox</code>
<code>2276</code>
3.3、pidof--pid of xx
pid of xx,字面翻译过来就是 xx的PID,和pgrep相比稍显不足的是,pidof必须给出进程的全名
<code>[root@localhost ~]</code><code># pidof firefox-bin</code>
二、Kill命令结束指定进程
1、命令格式:
kill[参数][进程号pid]
2.命令功能:
发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。
3.命令参数:
-l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称,eg:[root@localhost ~]# kill -l
-a 当处理当前进程时,不限制命令名和进程号的对应关系
-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s 指定发送信号
-u 指定用户
注意:
1、kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:
kill -2 123
它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。
2、应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。下面是常用的信号:
HUP 1 终端断线,如果想要更改配置而不需停止并重新启动服务,可以使用zhe个命令
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
USR1 通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
这些signal可以通过kill -l查看
8
9
10
11
12
13
14
15
<code>[root@finchina ~]</code><code># kill -l</code>
<code> </code><code>1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP</code>
<code> </code><code>6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1</code>
<code>11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM</code>
<code>16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP</code>
<code>21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ</code>
<code>26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR</code>
<code>31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3</code>
<code>38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8</code>
<code>43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13</code>
<code>48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12</code>
<code>53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7</code>
<code>58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2</code>
<code>63) SIGRTMAX-1 64) SIGRTMAX </code>
<code>[root@finchina ~]</code><code>#</code>
3、init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。init进程是不可杀的!
4、USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
<code>kill</code> <code>-USR1 `</code><code>cat</code> <code>/usr/local/nginx/logs/nginx</code><code>.pid`</code>
4、实例
4.1终止firefox进程
<code>3049</code>
<code>[root@localhost ~]</code><code># ps -ef|grep firefox</code>
<code>root 3049 1 2 07:36 ? 00:00:00 </code><code>/usr/lib/firefox/firefox</code>
<code>root 3089 2979 0 07:37 pts</code><code>/0</code> <code>00:00:00 </code><code>grep</code> <code>firefox</code>
<code>[root@localhost ~]</code><code># kill 3049</code>
4.2改进1
<code>[root@localhost ~]</code><code># kill -9 $(pgrep firefox)</code>
$( )的用途和反引号` `一样,用来表示优先执行的命令,这里的kill -9 $(pgrep firefox)表示先执行pgrep firefox再kill -9 结束该进程
4.3改进2--pkill
pkill=pgrep+kill
<code>[root@localhost ~]</code><code># pkill firefox</code>
<code>[root@localhost ~]</code><code># pkill -9 firefox</code>
"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。
4.3改进3-killall
killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID,和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。
<code>[root@localhost ~]</code><code># killall httpd</code>
<code></code>
本文转自 justin_peng 51CTO博客,原文链接:http://blog.51cto.com/ityunwei2017/1313927,如需转载请自行联系原作者