kill 命令詳解 系統信號

kill 命令詳解 系統信號

kill  命令詳解  系統信號

 

參考:

瞭解Linux的進程與線程

http://www.cnblogs.com/MYSQLZOUQI/p/4234005.html

Linux就這個範兒 P532

 


 

kill -HUP pid

http://blog.csdn.net/zhuying_linux/article/details/7031573

 

kill -HUP pid 
pid 是進程標識。如果想要更改配置而不需停止並重新啓動服務,請使用該命令。在對配置文件作必要的更改後,發出該命令以動態更新服務配置。

根據約定,當您發送一個掛起信號(信號 1 或 HUP)時,大多數服務器進程(所有常用的進程)都會進行復位操作並重新加載它們的配置文件。清單 2 顯示了向所有正在運行的 Web 服務器進程發送掛起信號的一種方法。


清單 2. 告訴 Web 服務器重新加載其配置文件並對文件進行復位操作

root@holy [507]$ ps -A | grep httpd | grep -v grep | awk '{ print $1; }' | xargs -L 1 sudo kill -HUP  

 


上面的命令中包含了很多的操作,所以讓我們來仔細地看一下管道的每個部分。ps 和 grep 命令用來在所有的進程中搜索 httpd(並且忽略用來搜索 httpd 進程的 grep 進程)。接下來,awk 只顯示輸出結果中的進程 ID,並將它傳遞給 xargs。

然後,xargs 命令接受每個進程 ID(因爲使用了 -L 1 以便一次提取一行內容),並使用 sudo kill -HUP 向相應的進程發送一個掛起信號。

LINUX和Unix都適用: 
改/etc/ssh/sshd_config,將裏面的Port改爲新端口,比如10022,然後 kill -HUP `cat /var/run/sshd.pid` 就行了。 
現有連接自己不會斷,因爲kill -HUP `cat /var/run/sshd.pid` 只是HUP監聽的那個,已經建立的連接(不同的 pid)不會斷。

 

vi /etc/ssh/sshd_config

/etc/init.d/sshd restart
kill -HUP `cat /var/run/sshd.pid`
#測試發現 restart和kill的效果都是一樣,原有連接無問題,新建連接連不上

 


然後你在現有賬號下面exit,在用新的端口登陸就可以了。 

PS:

HUP(1)是讓進程掛起,睡眠;

kill (9)六親不認的殺掉

term(15)正常的退出進程

因爲進程可能屏蔽某些信號,所以它們的用處也就不一樣。。


http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html

Linux中的kill命令用來終止指定的進程(terminate a process)的運行,是Linux下進程管理的常用命令。通常,終止一個前臺進程可以使用Ctrl+C鍵,但是,對於一個後臺進程就須用kill命令來終止,我們就需要先使用ps/pidof/pstree/top等工具獲取進程PID,然後使用kill命令來殺掉該進程。kill命令是通過向進程發送指定的信號來結束相應進程的。在默認情況下,採用編號爲15的TERM信號。TERM信號將終止所有不能捕獲該信號的進程。對於那些可以捕獲該信號的進程就要用編號爲9的kill信號,強行“殺掉”該進程。 

trap命令捕捉信號
bash 自帶trap命令  就是捕捉信號的  

語法:
trap  '執行的命令'  信號                 捕捉到該信號 執行單引號裏的命令

實例

trap 'cat /etc/fstab' INIT

 

 

1.命令格式:

kill[參數][進程號]

2.命令功能:

發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果任無法終止該程序可用“-KILL” 參數,其發送的信號爲SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。

3.命令參數:

-l   打印信號編號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱

-a  當處理當前進程時,不限制命令名和進程號的對應關係

-p  只打印相關進程的進程號,而不發送任何信號

-s  指定發送信號

-u  指定用戶,kill某個用戶的所有進程

注意:

1、kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發出終止信號(15),這個信號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用kill向進程發送特定的信號。例如:

kill -2 123

它的效果等同於在前臺運行PID爲123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9信號。

2、kill可以帶有進程ID號作爲參數。當用kill向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有權限撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。

3、可以向多個進程發信號或終止它們。

4、當kill成功地發送了信號後,shell會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下Enter鍵使shell的命令提示符再次出現時,纔會顯示出來。

5、應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用kill信號(9),因爲進程不能首先捕獲它。要撤銷所有的後臺作業,可以輸入kill 0。因爲有些在後臺運行的命令會啓動多個進程,跟蹤並找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啓動的進程,是個有效的方法。

4.使用實例:

實例1:列出所有信號名稱

命令:

kill -l

輸出:

[root@localhost test6]# kill -l
 0) EXIST  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 

說明:
只有第9種信號(SIGKILL)纔可以無條件終止進程,SIGKILL信號進程無法捕獲,進程也不得不無條件終止,其他信號進程都有權利忽略
HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強制終止
CONT 18 繼續(與STOP相反, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)
CHLD 17 父進程或init進程進行收拾殭屍進程用到的信號
ILL 4 非法訪問 進程接收信號有兩種:同步和異步 同步信號比如SIGILL(非法訪問) trap命令 同步信號也稱爲陷阱,異步信號如kill, 異步信號也稱爲中斷。
SIGRTMIN 信號請求號介於SIGRTMIN和SIGRTMAX之間的信號是可靠的也叫實時信號,除此之外的都是不可靠的,也叫非實時信號
SIGRTMAX 信號請求號介於SIGRTMIN和SIGRTMAX之間的信號是可靠的也叫實時信號,除此之外的都是不可靠的,也叫非實時信號

 

kill -0 pid 不發送任何信號,但是系統會進行錯誤檢查。
所以經常用來檢查一個進程是否存在,存在返回0;不存在返回1

man手冊裏:

The signals listed below may be available for use with kill. When known constant, numbers and default behavior are shown.
Name Num Action Description
0 0 n/a exit code indicates if a signal may be sent

 

 

實例2:得到指定信號的數值

命令:

輸出:

[root@localhost test6]# kill -l KILL

9[root@localhost test6]# kill -l SIGKILL

9[root@localhost test6]# kill -l TERM

15[root@localhost test6]# kill -l SIGTERM

15[root@localhost test6]#

說明:

實例3:先用ps查找進程,然後用kill殺掉

命令:

kill 3268

輸出:

[root@localhost test6]# ps -ef|grep vim 

root      3268  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@localhost test6]# kill 3268 

[root@localhost test6]# kill 3268 

-bash: kill: (3268) - 沒有那個進程

[root@localhost test6]#

說明:

實例4:徹底殺死進程

命令:

kill –9 3268 

輸出:

[root@localhost test6]# ps -ef|grep vim 

root      3268  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@localhost test6]# kill –9 3268 

[root@localhost test6]# kill 3268 

-bash: kill: (3268) - 沒有那個進程

[root@localhost test6]#

說明:

實例5:殺死指定用戶所有進程

命令:

kill -9 $(ps -ef | grep peidalinux)

kill -u peidalinux

輸出:

[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux) 

[root@localhost ~]# kill -u peidalinux

說明:

方法一,過濾出hnlinux用戶進程並殺死

實例6:init進程是不可殺的

命令:

kill -9 1

輸出:

[root@localhost ~]# ps -ef|grep init

root         1     0  0 Nov02 ?        00:00:00 init [3]                  

root     17563 17534  0 17:37 pts/1    00:00:00 grep init

[root@localhost ~]# kill -9 1

[root@localhost ~]# kill -HUP 1

[root@localhost ~]# ps -ef|grep init

root         1     0  0 Nov02 ?        00:00:00 init [3]                  

root     17565 17534  0 17:38 pts/1    00:00:00 grep init

[root@localhost ~]# kill -KILL 1

[root@localhost ~]# ps -ef|grep init

root         1     0  0 Nov02 ?        00:00:00 init [3]                  

root     17567 17534  0 17:38 pts/1    00:00:00 grep init

[root@localhost ~]#

說明:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章