新聞中心
本文轉(zhuǎn)載自微信公眾號「 小姐姐味道」,作者小姐姐養(yǎng)的狗 。轉(zhuǎn)載本文請聯(lián)系小姐姐味道公眾號。

網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站設(shè)計,高端網(wǎng)頁制作,對成都墻體彩繪等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)seo優(yōu)化優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
kill是殺死的意思,帶有主動的意味。鑒于master、slave這樣的名詞,需要在計算機軟件中進行整改,kill這樣明顯帶有負面信息的單詞,按理說也需要被干掉。
不過,如果把命令名字改了,效果也許會更好。因為在Linux上,kill根本就不是殺死的意思。
它只是想要給進程發(fā)送一個信號而已。使用kill -l可以看到長長的信號列表。
對Java程序員來說,用的最多的就是kill -9,我也不知道從哪里來的傳承,碼農(nóng)們都喜歡這種暴力性的命令--喜歡用鋒利的匕首一擊致命。
但是這種玩法又危險的多,不給進程說話的機會。
大家都知道電視劇里,重要人物臨死的時候,會啰啰嗦嗦說很多話,話說不完是不會死的。無論是武林高手,還是達官貴人,都得交代一些能讓故事情節(jié)繼續(xù)發(fā)展下去的廢話。
《水滸傳》里的“英雄們”,來的就相對直接一些??吹牟凰苯訂蔚吨比肭兄幸Γ辉试S他人有一丁點的廢話,通常情況下直接嗝屁。
各位使用kill -9的兄弟們,個個都像黑黑的李逵,單純、暴力、不講人情。
- SIGKILL
- 9
- Kill signal
- 結(jié)束信號
中國的中庸太極之道,在此蕩然無存。kill -9直接使得優(yōu)雅關(guān)閉這個名詞成了廢物。
何為優(yōu)雅關(guān)閉?其實就像是人的“遺言”,要在死之前,交代一些身后事。
我就常常在想,在我死之前,要把所有的錢花的一分不剩。既不留給后代,也不讓它爛在銀行里。這就需要做很多事。
計算機軟件中,在死之前,要處理的事情也還不少。比如,需要把緩沖區(qū)的內(nèi)容處理完畢,發(fā)送出去;微服務(wù)節(jié)點需要先把自己從注冊中心摘除,才能放心的go die。
大體來說,有下面幾個影響:
- 請求丟失:內(nèi)存隊列中等待執(zhí)行請求丟失
- 數(shù)據(jù)丟失:處于內(nèi)存緩存中數(shù)據(jù)未持久化到磁盤
- 文件損壞:正在寫的文件沒有沒有更新完成,導(dǎo)致文件損壞
- 業(yè)務(wù)中斷:處理一半的業(yè)務(wù)被強行中斷,如支付成功了,卻沒有更新到數(shù)據(jù)庫中
- 服務(wù)未下線:上游服務(wù)依然往停止節(jié)點發(fā)送請求
這些情況下,如果把服務(wù)玩壞了,正好被領(lǐng)導(dǎo)撞上,被開是分分鐘的事。
Java應(yīng)用中處處充斥著這種優(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對你的應(yīng)用不好使了,或者應(yīng)用幾乎沒有響應(yīng)了。使用kill -3是一種曲線救國的方式。
其實是JDK屏蔽了這個信號,對Java來說是一個福利。我們在JDK的文檔中找到相關(guān)介紹。
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。
作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。
當(dāng)前標(biāo)題:“kill-9”一時爽,秋后算賬淚兩行
URL鏈接:http://fisionsoft.com.cn/article/dhdeddd.html


咨詢
建站咨詢
