kill相關的信號簡述

##kill命令的原理 kill命令在linux中用來結束進程。但實際上,並非kill殺死了進程,kill只是向內核發送了操做系統信號和進程標示號(PID),由內核負責處理須要結束的進程。 使用kill -l能夠查看支持發送的信號:linux

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

這些信號的解釋能夠經過man 7 signal來查看。 kill除了測試程序遇到各類狀況的退出狀態,經常使用的其實只有三個:session

    1. SIGHUP man pag中說是在控制終端上是掛起信號, 或者控制進程結束,動做是A表示缺省是結束進程

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

  • 9)SIGKILL 這個信號通常被人稱爲殺死進程,簡單來講就是內核收到該信號和進程的PID後,會馬上中止結束該進程。怎麼個當即,後面會說。這個信號不能被捕獲也不能被忽略

SIGKILL有幾個特性須要注意:

殭屍進程不能被殺死,由於它們已經死亡,只等待它們的父進程回收它們。
處於阻塞狀態的進程不會死亡,直到它們再次醒來。
init進程是特殊的:它不得到它不想處理的信號,所以它能夠忽略SIGKILL。
由於SIGKILL不給進程任何在終止時作清理操做的機會,在大部分系統關閉過程當中,在採起SIGKILL以前,使用信號SIGTERM使進程終止的嘗試先被做出。
即便SIGKILL被髮送給它,一個正在不可中斷睡眠的進程也可能不會終止(而且釋放它的資源)。這是少數幾個一個UNIX系統可能須要被從新啓動來解決臨時軟件問題的例子中的一個。

關於殭屍進程能夠參考wiki,簡單來講就是父進程沒有wait/waitpid的已經結束的進程。

  • 15)SIGTERM 這個信號與SIGKILL類似,可是更友好一些,也是kill默認發送的信號。這個信號能夠被捕獲,容許程序作一些清理工做,也能夠容許一些重要的進程直接忽略信號,防止誤殺。可是這個信號和你點擊窗口的X號好像不是一回事。這個信號的特性是只有當前進程收到信號,子進程不會收到。若是當前進程被kill了,那麼它的子進程的父進程將會是init,也就是pid爲1的進程,換句話說這個操做容易產生孤兒進程。
相關文章
相關標籤/搜索