轉自:https://www.cnblogs.com/liuhouhou/p/5400540.html
大家對kill -9 肯定非常熟悉,在工作中也經常用到。特別是你去重啟tomcat時。可是多半看來,我們對-9的理解只是表面而已。
很少有人(包括我)認真的去了解一下 kill -n 這個n到底是什么東東。自我批評一下。
好吧。我們來好好的認識一下這個熟悉的陌生人。
1. kill
1)kill
從help中可以清晰的看到 -n 指的是 信號編號,那問題來了,“信號編號”是哪位大神???
2)kill -l(查看Linux/Unix的信號變量)
這么多呀!! 今天就單獨說一下SIGKILL和SIGTERM
3)(kill pid) 、( kill -15 pid)
系統會發送一個SIGTERM的信號給對應的程序。當程序接收到該signal后,將會發生以下的事情
- 程序立刻停止
- 當程序釋放相應資源后再停止
- 程序可能仍然繼續運行
大部分程序接收到SIGTERM信號后,會先釋放自己的資源,然后在停止。但是也有程序可以在接受到信號量后,做一些其他的事情,並且這些事情是可以
配置的。如果程序正在等待IO,可能就不會立馬做出相應。
也就是說,SIGTERM多半是會被阻塞的、忽略。
4)kill -9 pid
你不是可以不響應 SIGTERM嗎??那好,我給你下一道必殺令,我看你還不乖乖的。多半admin會用這個命令
不過,也不是所有的程序都會乖乖聽話,總有那些狀態下的程序無法立刻相應。
2.pkill
pkill和kill也有同樣的格式, 只不過指定的是進程名,pkill -signal process_name, signal的值和kill -l顯示的相同,默認15,強制的話可以指定9
如下可以等同, kill -9 `pidof process_name`和pkill -9 process_name
3.killall
當ps -e里面存在多個相同的進程名而對應擁有着不同的進程號,kill則只能殺死1個進程,其他相同名稱的進程仍然存在,而pkill和killall,則可以一次殺死所有擁有相同名稱的進程. killall和kill, pkill一樣可以使用-signal, 也就是-9, -15. 他和pkill的用法幾乎相同,當然pkill可以指定非完整名稱,而killall則必須指定完整進程名稱。
Attention: 不管是kill還是pkill, 在執行kill -9之前,最好執行kill -15給進程一次自己殺死自己的機會,這樣可以清楚一些文件或者恢復一些狀態,否則可能會留一些corrupt文件,從而影響進程的再次啟動。