我使用過的Linux命令之kill - 終止進程/發送信號

用途說明

kill命令用於終止指定的進程(terminate a process),是Unix/Linux下進程管理的經常使用命令。一般,咱們在須要終止某個或某些進程時,先使用ps/pidof/pstree/top等工具獲取進程PID,而後使用kill命令來殺掉該進程。kill命令的另一個用途就是向指定的進程或進程組發送信號(The  command kill sends the specified signal to the specified process or process group),或者肯定進程號爲PID的進程是否還在。好比,有許多程序都把SIGHUP信號做爲從新讀取配置文件的觸發條件。 linux

在Bash中,kill命令是個Shell內建命令,爲何呢?緣由有兩個:第一個緣由,Bash能夠進行任務管理(&,Ctrl+Z,bg,fg,kill %jobid等指令),若是kill只是一個外部命令,那麼在須要終止某個任務時就會很難辦,由於任務是與終端關聯的,反過來,若是kill命令是shell內建命令,就能夠很方便的採用kill %jobid的形式去殺掉指定任務(彷佛這個緣由還不是很充分);第二個緣由,是更加劇要的,若是要殺掉某個進程還得來啓動一個名爲kill的子進程,那麼在達到容許建立的進程數量上限時,連kill進程自己都沒法建立了,還怎麼來殺掉其餘進程呢!(Kill is a shell builtin for two reasons: it allows job IDs to be used instead of process IDs, and, if you have reached the limit on processes that you can create, you don't have to start a process to kill another one.) shell

 

經常使用參數

格式:kill <pid> vim

格式:kill -TERM <pid> bash

發送SIGTERM信號到指定進程,若是進程沒有捕獲該信號,則進程終止(If no signal is specified, the TERM signal is sent.  The TERM signal will kill processes which do not catch this signal.) 數據結構

 

格式:kill -l ide

列出全部信號名稱(Print a list of signal names.  These are found in /usr/include/linux/signal.h)。只有第9種信號(SIGKILL)才能夠無條件終止進程,其餘信號進程都有權利忽略。下面是經常使用的信號: 工具

HUP     1    終端斷線
INT       2    中斷(同 Ctrl + C)
QUIT    3    退出(同 Ctrl + \)
TERM    15    終止
KILL      9    強制終止
CONT   18    繼續(與STOP相反, fg/bg命令)
STOP    19    暫停(同 Ctrl + Z) ui

 

格式:kill -l <signame> this

顯示指定信號的數值。 spa

 

格式:kill -9 <pid>

格式:kill -KILL <pid>

強制殺掉指定進程,無條件終止指定進程。

 

格式:kill %<jobid>

格式:kill -9 %<jobid>

殺掉指定的任務(使用jobs命令能夠列出)

 

使用示例

示例一 kill命令是什麼類型的命令

[root@new55 ~]# type -a kill 
kill is a shell builtin
kill is /bin/kill
kill is /usr/bin/kill

[root@new55 ~]# help kill 
kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    Send the processes named by PID (or JOBSPEC) the signal SIGSPEC.  If
    SIGSPEC is not present, then SIGTERM is assumed.  An argument of `-l'
    lists the signal names; if arguments follow `-l' they are assumed to
    be signal numbers for which names should be listed.  Kill is a shell
    builtin for two reasons: it allows job IDs to be used instead of
    process IDs, and, if you have reached the limit on processes that
    you can create, you don't have to start a process to kill another one.

[root@new55 ~]#

 

示例二 列出全部信號名稱

[root@new55 ~]# kill -l 
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
[root@new55 ~]#

/usr/include/linux/signal.h 寫道
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
/*
#define SIGLOST 29
*/
#define SIGPWR 30
#define SIGSYS 31
#define SIGUNUSED 31

/* These should not be considered constants from userland. */
#define SIGRTMIN 32
#define SIGRTMAX _NSIG

 

示例三 獲得指定信號的數值

[root@new55 ~]# kill -l KILL 
9
[root@new55 ~]# kill -l SIGKILL 
9
[root@new55 ~]# kill -l TERM 
15
[root@new55 ~]# kill -l SIGTERM 
15
[root@new55 ~]#

 

示例四 init進程是不可殺的!

init是Linux系統操做中不可缺乏的程序之一。所謂的init進程,它是一個由內核啓動的用戶級進程。內核自行啓動(已經被載入內存,開始運行,並已初始化全部的設備驅動程序和數據結構等)以後,就經過啓動一個用戶級程序init的方式,完成引導進程。因此,init始終是第一個進程(其進程編號始終爲1)。 其它全部進程都是init進程的子孫。

[root@new55 ~]# kill -HUP 1 
[root@new55 ~]# kill -9 1 
[root@new55 ~]# kill -KILL 1

系統依然在運行。 
[root@new55 ~]#

 

示例五 先用ps查找進程,而後用kill殺掉

[root@new55 ~]# ps -ef|grep vim 
root      3368  2884  0 16:21 pts/1    00:00:00 vim install.log
root      3370  2822  0 16:21 pts/0    00:00:00 grep vim
[root@new55 ~]# kill 3368 
[root@new55 ~]# kill 3368 
-bash: kill: (3368) - 沒有那個進程
[root@new55 ~]#

 

示例六 殺掉指定任務

[root@new55 ~]# tail -f install.log 
瀹夎 scim-bridge-gtk-0.4.5-9.el5.i386
瀹夎 scim-pinyin-0.5.91-16.el5.i386
瀹夎 scim-chewing-0.3.1-11.el5.i386
瀹夎 scim-chinese-standard-0.0.2-1.el5.i386
瀹夎 scim-tables-0.5.6-7.i386
瀹夎 scim-qtimm-0.9.4-5.i386
瀹夎 scim-tables-chinese-0.5.6-7.i386
瀹夎 fonts-chinese-3.02-12.el5.noarch
瀹夎 isdn4k-utils-3.2-56.el5.i386
瀹夎 stardict-2.4.5-5.i386
Ctrl+Z 
[1]+  Stopped                 tail -f install.log
[root@new55 ~]# kill %1 
[root@new55 ~]# kill %1  -bash: kill: (3379) - 沒有那個進程 [1]+  已終止                  tail -f install.log [root@new55 ~]#

相關文章
相關標籤/搜索