##kill命令的原理 kill命令在linux中用來結束進程。但實際上,並非kill殺死了進程,kill只是向內核發送了操做系統信號和進程標示號(PID),由內核負責處理須要結束的進程。 使用kill -l
能夠查看支持發送的信號:linux
- SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
這些信號的解釋能夠經過man 7 signal
來查看。 kill除了測試程序遇到各類狀況的退出狀態,經常使用的其實只有三個:session
wiki百科測試
UNIX中進程組織結構爲 session (會話)包含一個前臺進程組及一個或多個後臺進程組,一個進程組包含多個進程。一個session可能會有一個session首進程,而一個session首進程可能會有一個控制終端。一個進程組可能會有一個進程組首進程。進程組首進程的進程ID與該進程組ID相等。這兒是可能會有,在必定狀況之下是沒有的。與終端交互的進程是前臺進程,不然即是後臺進程。 SIGHUP會在如下3種狀況下被髮送給相應的進程: 一、終端關閉時,該信號被髮送到session首進程以及做爲job提交的進程(即用 & 符號提交的進程)
二、session首進程退出時,該信號被髮送到該session中的前臺進程組中的每個進程
三、若父進程退出致使進程組成爲孤兒進程組,且該進程組中有進程處於中止狀態(收到SIGSTOP或SIGTSTP信號),該信號會被髮送到該進程組中的每個進程。
系統對SIGHUP信號的默認處理是終止收到該信號的進程。因此若程序中沒有捕捉該信號,當收到該信號時,進程就會退出。操作系統
除此以外這個信號時能夠被捕捉的,不少服務(Apache,Ngnix)將這個信號視爲relaod,即重啓。code
關於這個信號有一個頗有意思的命令:nohup。
這個命令就跟它的名字同樣,這個命令的做用就是試經過它運行的進程徹底忽略SIGHUP信號。通常而言,若是你以SSH等方式鏈接到遠程主機,當你但願運行一些程序而且當你退出後依然能在後臺運行的時候,除了at命令,你還可使用nohup這個命令。 。 用法:進程
nohup COMMAND #前景工做 nohup COMMAND & #背景工做
測試:ip
nohup ping 127.0.0.1 &
nohup: 忽略輸入並把輸出追加到"nohup.out"資源
pgrep ping
10363get
ctrl+D pgrep ping
10363it
SIGKILL有幾個特性須要注意:
殭屍進程不能被殺死,由於它們已經死亡,只等待它們的父進程回收它們。
處於阻塞狀態的進程不會死亡,直到它們再次醒來。
init進程是特殊的:它不得到它不想處理的信號,所以它能夠忽略SIGKILL。
由於SIGKILL不給進程任何在終止時作清理操做的機會,在大部分系統關閉過程當中,在採起SIGKILL以前,使用信號SIGTERM使進程終止的嘗試先被做出。
即便SIGKILL被髮送給它,一個正在不可中斷睡眠的進程也可能不會終止(而且釋放它的資源)。這是少數幾個一個UNIX系統可能須要被從新啓動來解決臨時軟件問題的例子中的一個。
關於殭屍進程能夠參考wiki,簡單來講就是父進程沒有wait/waitpid的已經結束的進程。