老板:kill -9 的原理都不知道就敢去線上執(zhí)行泪蔫?明天不用來了!

image

相信很多程序員對于Linux系統(tǒng)都不陌生喘批,即使自己的日常開發(fā)機(jī)器不是Linux撩荣,那么線上服務(wù)器也大部分都是的,所以饶深,掌握常用的Linux命令也是程序員必備的技能餐曹。

但是,怕就怕很多人對于部分命令只是一知半解敌厘,使用不當(dāng)就能導(dǎo)致線上故障台猴。

前段時間,我們的線上應(yīng)用報警俱两,頻繁FGC饱狂,需要緊急處理問題,于是有同事去線上重啟機(jī)器(正常程序應(yīng)該是先采集堆dump宪彩,然后再重啟休讳,方便排查是否存在內(nèi)存泄露等問題)。

但是在重啟過程中尿孔,同事發(fā)現(xiàn)正常的重啟命令應(yīng)用無反應(yīng)俊柔,然后嘗試使用kill命令"殺"掉Java進(jìn)程磺樱,但是仍然無效。于是他私自決定使用 "kill -9"結(jié)束了進(jìn)程的生命婆咸。

雖然應(yīng)用進(jìn)程被干掉了竹捉,但是隨之而來帶來了很多問題,首先是上游系統(tǒng)突然發(fā)生大量報警尚骄,對應(yīng)開發(fā)找過來說調(diào)用我們的RPC服務(wù)無響應(yīng)块差,頻繁超時。

后來倔丈,我們又發(fā)現(xiàn)系統(tǒng)中存在部分臟數(shù)據(jù)憨闰,有些在同一個事務(wù)中需要完整更新的數(shù)據(jù),只跟新了一半…

為什么正常的kill無法"殺掉"進(jìn)程需五,而kill -9就可以鹉动?為什么kill -9會引發(fā)這一連串連鎖反應(yīng)?正常的kill執(zhí)行時宏邮,JVM會如何處理的呢泽示?

要搞清楚這些問題,我們要先從kill命令說起蜜氨。

kill 命令

我們都知道械筛,想要在Linux中終止一個進(jìn)程有兩種方式,如果是前臺進(jìn)程可以使用Ctrl+C鍵進(jìn)行終止飒炎;如果是后臺進(jìn)程埋哟,那么需要使用kill命令來終止。(其實Ctrl+C也是kill命令)

kill命令的格式是:

kill[參數(shù)][進(jìn)程號]

如:
kill 21121
kill -9 21121

其中[參數(shù)]是可選的郎汪,進(jìn)程號可以通過jps/ps/pidof/pstree/top等工具獲取赤赊。

kill的命令參數(shù)有以下幾種:

-l 信號,若果不加信號的編號參數(shù)煞赢,則使用“-l”參數(shù)會列出全部的信號名稱
-a 當(dāng)處理當(dāng)前進(jìn)程時抛计,不限制命令名和進(jìn)程號的對應(yīng)關(guān)系
-p 指定kill 命令只打印相關(guān)進(jìn)程的進(jìn)程號,而不發(fā)送任何信號
-s 指定發(fā)送信號
-u 指定用戶

通常情況下耕驰,我們使用的-l(信號)的時候比較多爷辱,如我們前文提到的kill -9中的9就是信號。

信號如果沒有指定的話朦肘,默認(rèn)會發(fā)出終止信號(15)饭弓。常用的信號如下:

HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強(qiáng)制終止
CONT 18 繼續(xù)(與STOP相反, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)

比較常用的就是強(qiáng)制終止信號:9和終止信號:15媒抠,另外弟断,中斷信號:2其實就是我們前文提到的Ctrl + C結(jié)束前臺進(jìn)程。

那么趴生,kill -9 和 kill -15到底有什么區(qū)別呢阀趴?該如何選擇呢昏翰?

kill -9 和 kill -15的區(qū)別

kill命令默認(rèn)的信號就是15,首先來說一下這個默認(rèn)的kill -15信號刘急。

當(dāng)使用kill -15時棚菊,系統(tǒng)會發(fā)送一個SIGTERM的信號給對應(yīng)的程序。當(dāng)程序接收到該信號后叔汁,具體要如何處理是自己可以決定的统求。

這時候,應(yīng)用程序可以選擇:

1据块、立即停止程序

2码邻、釋放響應(yīng)資源后停止程序

3、忽略該信號另假,繼續(xù)執(zhí)行程序

因為kill -15信號只是通知對應(yīng)的進(jìn)程要進(jìn)行"安全像屋、干凈的退出",程序接到信號之后边篮,退出前一般會進(jìn)行一些"準(zhǔn)備工作"己莺,如資源釋放、臨時文件清理等等苟耻,如果準(zhǔn)備工作做完了篇恒,再進(jìn)行程序的終止。

但是凶杖,如果在"準(zhǔn)備工作"進(jìn)行過程中,遇到阻塞或者其他問題導(dǎo)致無法成功款筑,那么應(yīng)用程序可以選擇忽略該終止信號智蝠。

這也就是為什么我們有的時候使用kill命令是沒辦法"殺死"應(yīng)用的原因,因為默認(rèn)的kill信號是SIGTERM(15)奈梳,而SIGTERM(15)的信號是可以被阻塞和忽略的杈湾。

和kill -15相比,kill -9就相對強(qiáng)硬一點攘须,系統(tǒng)會發(fā)出SIGKILL信號漆撞,他要求接收到該信號的程序應(yīng)該立即結(jié)束運行,不能被阻塞或者忽略于宙。

所以浮驳,相比于kill -15命令,kill -9在執(zhí)行時捞魁,應(yīng)用程序是沒有時間進(jìn)行"準(zhǔn)備工作"的至会,所以這通常會帶來一些副作用,數(shù)據(jù)丟失或者終端無法恢復(fù)到正常狀態(tài)等谱俭。

Java是如何處理SIGTERM(15)的

我們都知道奉件,在Linux中宵蛀,Java應(yīng)用是作為一個獨立進(jìn)程運行的,Java程序的終止運行是基于JVM的關(guān)閉實現(xiàn)的县貌,JVM關(guān)閉方式分為3種:

正常關(guān)閉:當(dāng)最后一個非守護(hù)線程結(jié)束或者調(diào)用了System.exit或者通過其他特定平臺的方法關(guān)閉(接收到SIGINT(2)术陶、SIGTERM(15)信號等)
強(qiáng)制關(guān)閉:通過調(diào)用Runtime.halt方法或者是在操作系統(tǒng)中強(qiáng)制kill(接收到SIGKILL(9)信號)
異常關(guān)閉:運行中遇到RuntimeException異常等。

JVM進(jìn)程在接收到kill -15信號通知的時候煤痕,是可以做一些清理動作的梧宫,比如刪除臨時文件等。

當(dāng)然杭攻,開發(fā)者也是可以自定義做一些額外的事情的祟敛,比如讓tomcat容器停止,讓dubbo服務(wù)下線等兆解。

而這種自定義JVM清理動作的方式馆铁,是通過JDK中提供的shutdown hook實現(xiàn)的。JDK提供了
Java.Runtime.addShutdownHook(Thread hook)方法锅睛,可以注冊一個JVM關(guān)閉的鉤子埠巨。

例子如下:

package com.hollis;

public class ShutdownHookTest {

    public static void main(String[] args) {
        boolean flag = true;
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("hook execute...");
        }));

        while (flag) {
            // app is runing
        }

        System.out.println("main thread execute end...");
    }
}

執(zhí)行命令:

? jps
6520 ShutdownHookTest
6521 Jps
? kill 6520

控制臺輸出內(nèi)容:

hook execute...
Process finished with exit code 143 (interrupted by signal 15: SIGTERM)

可以看到,當(dāng)我們使用kill(默認(rèn)kill -15)關(guān)閉進(jìn)程的時候现拒,程序會先執(zhí)行我注冊的shutdownHook辣垒,然后再退出,并且會給出一個提示:interrupted by signal 15: SIGTERM

如果我們執(zhí)行命令kill -9:

? kill -9 6520

控制臺輸出內(nèi)容:

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

可以看到印蔬,當(dāng)我們使用kill -9 強(qiáng)制關(guān)閉進(jìn)程的時候勋桶,程序并沒有執(zhí)行shutdownHook,而是直接退出了侥猬,并且會給出一個提示:interrupted by signal 9: SIGKILL

總結(jié)

kill命令用于終止Linux進(jìn)程例驹,默認(rèn)情況下,如果不指定信號退唠,kill 等價于kill -15鹃锈。

kill -15執(zhí)行時,系統(tǒng)向?qū)?yīng)的程序發(fā)送SIGTERM(15)信號瞧预,該信號是可以被執(zhí)行屎债、阻塞和忽略的,所以應(yīng)用程序接收到信號后垢油,可以做一些準(zhǔn)備工作盆驹,再進(jìn)行程序終止。

有的時候秸苗,kill -15無法終止程序召娜,因為他可能被忽略,這時候可以使用kill -9惊楼,系統(tǒng)會發(fā)出SIGKILL(9)信號玖瘸,該信號不允許忽略和阻塞秸讹,所以應(yīng)用程序會立即終止。

這也會帶來很多副作用雅倒,如數(shù)據(jù)丟失等璃诀,所以,在非必要時蔑匣,不要使用kill -9命令劣欢,尤其是那些web應(yīng)用、提供RPC服務(wù)裁良、執(zhí)行定時任務(wù)凿将、包含長事務(wù)等應(yīng)用中,因為kill -9 沒給spring容器价脾、tomcat服務(wù)器牧抵、dubbo服務(wù)、流程引擎侨把、狀態(tài)機(jī)等足夠的時間進(jìn)行收尾犀变。

最后,很多人會說秋柄,說了這么多获枝,不是還得用 kill -9 嗎?

其實骇笔,本文的目的不是不讓大家用省店,那就是因噎廢食了。本文是希望大家可以了解其背后的原理笨触,知道他可能帶來的副作用萨西。在選擇要不要執(zhí)行的時候,可以考慮到這些因素旭旭,如果能夠針對可能發(fā)生的副作用,提前做好預(yù)案和心理準(zhǔn)備葱跋,然后再執(zhí)行持寄,那就很完美了。

在執(zhí)行之后娱俺,發(fā)生了非預(yù)期的問題時稍味,大家可以想到有可能和kill -9有關(guān),那本文的目的也算達(dá)到了荠卷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末模庐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子油宜,更是在濱河造成了極大的恐慌掂碱,老刑警劉巖怜姿,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疼燥,居然都是意外死亡沧卢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門醉者,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但狭,“玉大人,你說我怎么就攤上這事撬即×⒋牛” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵剥槐,是天一觀的道長唱歧。 經(jīng)常有香客問我,道長才沧,這世上最難降的妖魔是什么迈喉? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮温圆,結(jié)果婚禮上挨摸,老公的妹妹穿的比我還像新娘。我一直安慰自己岁歉,他們只是感情好得运,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锅移,像睡著了一般熔掺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上非剃,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天置逻,我揣著相機(jī)與錄音,去河邊找鬼备绽。 笑死券坞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肺素。 我是一名探鬼主播恨锚,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倍靡!你這毒婦竟也來了猴伶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎他挎,沒想到半個月后筝尾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雇盖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年忿等,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔挖。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贸街,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狸相,到底是詐尸還是另有隱情薛匪,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布脓鹃,位于F島的核電站逸尖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瘸右。R本人自食惡果不足惜娇跟,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望太颤。 院中可真熱鬧苞俘,春花似錦、人聲如沸龄章。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽做裙。三九已至岗憋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锚贱,已是汗流浹背仔戈。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拧廊,地道東北人杂穷。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像卦绣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子飞蚓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容