來自公眾號:小姐姐味道
作者:小姐姐養(yǎng)的狗
作者簡介:一個不允許程序員走彎路的公眾號勤庐。聚焦基礎架構和Linux。十年架構好港,日百億流量愉镰,與你探討高并發(fā)世界,給你不一樣的味道钧汹。
kill
是殺死的意思丈探,帶有主動的意味。鑒于master
拔莱、slave
這樣的名詞碗降,需要在計算機軟件中進行整改,kill這樣明顯帶有負面信息的單詞辨宠,按理說也需要被干掉遗锣。
不過,如果把命令名字改了嗤形,效果也許會更好精偿。因為在Linux上,kill
根本就不是殺死的意思。
它只是想要給進程發(fā)送一個信號而已笔咽。使用kill -l
可以看到長長的信號列表搔预。
對Java程序員來說,用的最多的就是kill -9
叶组,我也不知道從哪里來的傳承拯田,碼農(nóng)們都喜歡這種暴力性的命令--喜歡用鋒利的匕首一擊致命。
但是這種玩法又危險的多甩十,不給進程說話的機會船庇。
大家都知道電視劇里,重要人物臨死的時候侣监,會啰啰嗦嗦說很多話鸭轮,話說不完是不會死的。無論是武林高手橄霉,還是達官貴人窃爷,都得交代一些能讓故事情節(jié)繼續(xù)發(fā)展下去的廢話。
《水滸傳》里的“英雄們”姓蜂,來的就相對直接一些按厘。看的不爽钱慢,直接單刀直入切中要害逮京,不允許他人有一丁點的廢話,通常情況下直接嗝屁滩字。
各位使用kill -9
的兄弟們造虏,個個都像黑黑的李逵,單純麦箍、暴力漓藕、不講人情。
SIGKILL
9
Kill signal
結束信號
中國的中庸太極之道挟裂,在此蕩然無存享钞。kill -9
直接使得優(yōu)雅關閉
這個名詞成了廢物。
何為優(yōu)雅關閉诀蓉?其實就像是人的“遺言”栗竖,要在死之前,交代一些身后事渠啤。
我就常常在想狐肢,在我死之前,要把所有的錢花的一分不剩沥曹。既不留給后代份名,也不讓它爛在銀行里碟联。這就需要做很多事。
計算機軟件中僵腺,在死之前鲤孵,要處理的事情也還不少。比如辰如,需要把緩沖區(qū)的內(nèi)容處理完畢普监,發(fā)送出去;微服務節(jié)點需要先把自己從注冊中心摘除琉兜,才能放心的go die
凯正。
大體來說,有下面幾個影響:
- 請求丟失:內(nèi)存隊列中等待執(zhí)行請求丟失
- 數(shù)據(jù)丟失:處于內(nèi)存緩存中數(shù)據(jù)未持久化到磁盤
- 文件損壞:正在寫的文件沒有沒有更新完成呕童,導致文件損壞
- 業(yè)務中斷:處理一半的業(yè)務被強行中斷漆际,如支付成功了,卻沒有更新到數(shù)據(jù)庫中
- 服務未下線:上游服務依然往停止節(jié)點發(fā)送請求
這些情況下夺饲,如果把服務玩壞了,正好被領導撞上施符,被開是分分鐘的事往声。
Java應用中處處充斥著這種優(yōu)雅
,靠的是shutdownhook
鉤子戳吝。就是下面這行代碼:
Runtime
.getRuntime()
.addShutdownHook(
new Thread(() -> System.out.println("Do something in Shutdown Hook")));
有沒有好的辦法浩销?有,用kill -15
發(fā)送SIGTERM
信號即可听哭。
但有時候kill -15
并不能殺死進程慢洋,這個時候,才是kill -9
需要出場的時候陆盘。
聽夠了15臨死前說的一些廢話普筹,使用9要它的命。
一般的隘马,需要使用kill -15
去嘗試殺死進程太防。如果過一段時間(比如10秒),進程還沒有停止酸员,kill -9
才會出場蜒车。
kill的默認信號值,就是15
幔嗦,可以說是很貼心了酿愧。但還是有很多人使用9
。
我想了半天原因邀泉,就是一個字:懶嬉挡。
kill -15
需要多次確認钝鸽,而kill -9
一次完事,多數(shù)情況下不會出事棘伴。有這提高工作效率的事寞埠,何樂而不為呢?
常用的信號焊夸,還有SIGQUIT仁连,也就是kill -3
。
在Java程序下阱穗,kill -3
的輸出特別有意思饭冬,它直接在stdout上輸出了jstack
命令所產(chǎn)生的內(nèi)容。如果是tomcat揪阶,那么輸出就在canalina.out
文件里昌抠。
如果jstack
對你的應用不好使了,或者應用幾乎沒有響應了鲁僚。使用kill -3
是一種曲線救國的方式炊苫。
其實是JDK屏蔽了這個信號,對Java來說是一個福利冰沙。我們在JDK的文檔中找到相關介紹侨艾。
Sun’s JVM catches signals to implement shutdown hooks for abnormal JVM termination. The JVM uses SIGHUP, SIGINT, and SIGTERM to initiate the running of shutdown hooks.
The JVM uses a similar mechanism to implement the pre-1.2 feature of dumping thread stacks for debugging purposes. Sun’s JVM uses SIGQUIT to perform thread dumps.
我這里有一個腳本,能夠接受兩個參數(shù)拓挥。第一個參數(shù)是pid
唠梨,第二個參數(shù)是等待的秒數(shù)。
pid=$1
count=$2
n=0
if [ ! -n $count ];then
count=10
fi
while [[ $n -lt $count ]]
do
let "n++"
kill -0 $pid
if [ $? -ne 0 ]
then
echo "program not exist"
break
else
echo "send kill -15 to $pid"
kill -15 $pid
sleep 1
fi
if [[ $n -eq $count ]]
then
echo "kill -9 $pid"
# after 10s , try to send kill -9
kill -9 $pid
fi
done
腳本將持續(xù)使用kill -0
判斷進程是否存在侥啤,然后持續(xù)發(fā)送kill -15
指令当叭。等超過指定的秒數(shù),進程依然存在盖灸,則最終發(fā)送kill -9
命令蚁鳖。
問題是,通常情況下糠雨,你還是需要等待上幾秒才睹。自動化機器人不會覺得煩,你會甘邀。
所以你還是用kill -9
琅攘。