天天看点

RHEL6基础之十八Linux中Kill进程的方法

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,如需转载请自行联系原作者

继续阅读