kill命令

kill命令

kill命令向指定的pid進程發送信號,若是不指定要發送的signal信號,則默認狀況下signalSIGTERM,它會終止進程,要列出全部可用信號,可使用-l選項獲取Linux信號列表,常用的信號包括HUPINTKILLSTOPCONT0,能夠經過三種方式指定信號: 按數字例如-9,帶有SIG前綴例如-SIGKILL,不帶SIG前綴例如-KILL。負PID值用於指示過程組ID,若是傳遞了進程組ID,則該組中的全部進程都將接收到該信號,PID-1是特殊的,其指示除兩個之外的全部進程,kill進程自己和initPID 1,其是系統上全部進程的父進程,將-1指定爲目標會將信號發送到除這兩個之外的全部進程。linux

語法

kill pid ...
kill {-signal | -s signal} pid ...
kill {-l | --list[=signal] | -L | --table}

參數

  • -signal, -s signal: 要發送的信號的名稱、縮寫名或編號,前面有破折號,例如-SIGTERM-TERM-15等,要查看可用信號的列表可使用kill -l
  • pid: 數字進程ID,若是不肯定某個進程的PID是什麼,可使用ps命令將其列出例如ps -aux,一般會配合管道與grep使用例如查看nginx相關的進程 ps -aux | grep nginx
  • -l, --list[=signal]: 列出可用的信號名稱,用-l--list列出全部信號名稱,使用--list = signal,可將數字轉換爲其信號名稱。
  • -L, --table: 在表格中列出可用的信號名稱和編號。

信號

下列的某些信號是不能使用的,由於系統有可能不支持這些信號,或者這些信號已中斷,詳情能夠實際查閱系統的kill -l命令。每一個系統都有信號13915,這些是最多見的信號。終止信號不只用於關閉鎖定的應用程序,還能夠阻止軟件執行不容許的任務,這意味着其中一些終止信號是安全的一部分,另外kill命令不只中止/終止進程,並且還暫停,繼續和從新啓動進程。nginx

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
  • SIGHUP: SIGHUP信號用於斷開進程與父進程的鏈接,這也能夠用於從新啓動進程,這對於內存泄漏的守護程序頗有用。
  • SIGINT: 該信號與按Ctrl+C相同,在某些系統上delete + break會向進程發送相同的信號,該進程被中斷並中止,可是該進程自身能夠忽略此信號。
  • SIGQUIT: 這相似於SIGINT,但因爲QUIT字符一般是由Ctrl+\來控制,進程在收到SIGQUIT退出時會產生core文件, 在這個意義上相似於一個程序錯誤信號。
  • SIGILL: 當一個進程執行一個錯誤的、禁止的或未知的功能時,系統向該進程發送SIGILL信號,這是表明非法操做的信號。
  • SIGTRAP: 此信號用於調試目的,當某個進程執行了某個操做或知足了調試器正在等待的條件時,此信號將被髮送到該進程。
  • SIGABRT: 該終止信號是停止信號,一般進程會在自身上發出此終止信號。
  • SIGBUS: 當一個進程被髮送SIGBUS信號時,是由於該進程致使了一個總線錯誤,一般這些總線錯誤是因爲進程試圖使用假物理地址或進程的內存對齊設置不正確形成的。
  • SIGFPE: 被零除的進程使用SIGFPE終止。
  • SIGKILL: SIGKILL信號強制進程當即中止執行,程序不能忽略該信號,此過程也沒法清除。
  • SIGUSR1: 這表示用戶定義的條件,用戶能夠經過在sigusr1.c中編程命令來設置此信號。
  • SIGSEGV: 當應用程序有分段衝突時,這個信號被髮送到進程。
  • SIGUSR2: 這表示用戶定義的條件。
  • SIGPIPE: 當進程嘗試寫入缺乏與讀取器鏈接的一端的管道時,此信號將發送到進程,讀取器是在管道末端讀取數據的過程。
  • SIGALRM: 當實時或時鐘計時器到期時,將發送SIGALRM
  • SIGTERM: 該信號請求進程中止運行,該信號能夠被程序自身忽略,該過程有時間正常關閉,當程序正常關閉時,這意味着它有時間保存進度並釋放資源,換句話說即它不被迫中止。
  • SIGCHLD: 當父進程丟失其子進程時,將向父進程發送SIGCHLD信號,這將清理子進程使用的資源,子進程指的是由另外一個稱爲父進程的進程啓動的進程。
  • SIGCONT: 要使進程在被SIGTSTPSIGSTOP信號暫停後繼續執行,須要將SIGCONT信號發送到已暫停的進程,這是CONTiNUE SIGNAL,該信號對Unix做業控制執行後臺任務頗有幫助。
  • SIGSTOP: 該信號使操做系統暫停進程的執行,進程自身不能忽略該信號。
  • SIGTSTP: 這個信號相似於按下Ctrl+Z,它向包含進程的終端發出請求,請求進程暫時中止,進程自身能夠忽略該信號。
  • SIGTTIN: 當進程試圖從tty終端讀取數據時,進程接收到這個信號。
  • SIGTTOU: 當某個進程嘗試向tty終端進行寫操做時,該進程將收到此信號。
  • SIGURG: 當進程中有緊急數據要讀取或數據很是大時,SIGURG信號將發送到該進程。
  • SIGXCPU: 當某個進程在分配的時間以後使用CPU時,系統將向該進程發送該信號,SIGXCPU的行爲就像一個警告,該進程有時間保存進度(若是可能)並在系統使用SIGKILL終止該進程以前將其關閉。
  • SIGXFSZ: 文件系統對文件的大小有限制,當程序嘗試違反此限制時,系統將發送該過程SIGXFSZ信號。
  • SIGVTALRM: SIGVTALRM在進程使用的CPU時間結束時發送。
  • SIGPROF: 當進程以及由系統表明進程使用的CPU時間過去時,將發送SIGPROF信號。
  • SIGWINCH: 當進程在更改其大小的終端中時,該進程將接收此信號。
  • SIGIO: SIGPOLL的別名或至少表現得很像SIGPOLL
  • SIGPWR: 電源故障將致使系統將該信號發送到進程,若是系統仍在運行。
  • SIGSYS: 爲系統調用提供無效參數的進程將接收此信號。
  • SIGRTMIN*: 這是一組在系統之間變化的信號,它們被標記爲SIGRTMIN + 1SIGRTMIN + 2SIGRTMIN + 3...,一般最多15個,這些是用戶定義的信號,它們必須在Linux內核的源代碼中進行編程。
  • SIGRTMAX*: 這是一組在系統之間變化的信號,它們被標記爲SIGRTMAX-1SIGRTMAX-2SIGRTMAX-3...,一般最多14個,這些是用戶定義的信號,它們必須在Linux內核的源代碼中進行編程。
  • SIGEMT: 指示一個實現定義的硬件故障。
  • SIGINFO: 終端有時可能會向進程發送狀態請求,發生這種狀況時,進程也將收到此信號。
  • SIGLOST: 試圖訪問鎖定文件的進程將收到此信號。
  • SIGPOLL: 當進程引發異步I/O事件時,會向該進程發送SIGPOLL信號。

示例

要顯示全部可用信號,查看信號的詳細信息可使用man命令,例如信號7 SIGBUS即便用man 7 signalgit

kill -l

在表格中列出可用的信號名稱和編號。github

kill -L

終端斷線,從新加載配置文件,平滑重啓。shell

kill -1 111

通知進程關閉,使進程自行關閉,這個關閉是安全、乾淨地退出,若是kill命令後直接加進程的pid號默認選項爲-15,這個信號是能夠被進程自身忽略並繼續執行自身的,即該信號是能夠被阻塞和忽略的。編程

kill -15 111

強行中斷當前程序的執行,相似Ctrl+C按鍵用以結束進程的結果,該信號是能夠被阻塞和忽略的。安全

kill -2 111

退出進程,相似Ctrl+\按鍵用以結束進程的結果,該信號是能夠被阻塞和忽略的。異步

kill -3 111

強行關閉進程,-9信號是無條件終止,這個信號不能被捕獲或忽略,同時接收這個信號的進程在收到這個信號時不能執行任何清理,該信號是不能夠被阻塞和忽略的,固然一般是不建議使用kill -9的,應該嘗試使用-15以及-2給目標進程一個清理自身資源工做的機會,不要用收割機來修剪花盆裏的花。操作系統

kill -9 111

暫停進程,對於暫停信號進程自身不能忽略該信號。unix

kill -19 111

激活進程,對於激活信號必須發送到已暫停的進程纔有效。

kill -18 111

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://www.computerhope.com/unix/ukill.htm
https://www.linux.org/threads/kill-commands-and-signals.8881/
https://www.geeksforgeeks.org/kill-command-in-linux-with-examples/
相關文章
相關標籤/搜索