成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

報(bào)告老板,我不小心執(zhí)行了kill -9命令

開(kāi)發(fā) 前端 開(kāi)發(fā)工具
相信很多程序員對(duì)于Linux系統(tǒng)都不陌生,即使自己的日常開(kāi)發(fā)機(jī)器不是Linux,那么線上服務(wù)器也大部分都是的,所以,掌握常用的 Linux 命令也是程序員必備的技能。

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

[[326593]]

圖片來(lái)自 Pexels

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

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

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

雖然應(yīng)用進(jìn)程被干掉了,但是隨之而來(lái)帶來(lái)了很多問(wèn)題,首先是上游系統(tǒng)突然發(fā)生大量報(bào)警,對(duì)應(yīng)開(kāi)發(fā)找過(guò)來(lái)說(shuō)調(diào)用我們的 RPC 服務(wù)無(wú)響應(yīng),頻繁超時(shí)。

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

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

要搞清楚這些問(wèn)題,我們要先從 kill 命令說(shuō)起。

kill 命令

我們都知道,想要在 Linux 中終止一個(gè)進(jìn)程有兩種方式,如果是前臺(tái)進(jìn)程可以使用 Ctrl+C 鍵進(jìn)行終止;如果是后臺(tái)進(jìn)程,那么需要使用kill命令來(lái)終止。(其實(shí) Ctrl+C 也是 kill 命令)

kill 命令的格式是:

  1. kill[參數(shù)][進(jìn)程號(hào)] 
  2. 如:  
  3. kill 21121  
  4. kill -9 21121 

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

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

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

通常情況下,我們使用的 -l(信號(hào))的時(shí)候比較多,如我們前文提到的 kill -9 中的 9 就是信號(hào)。

信號(hào)如果沒(méi)有指定的話(huà),默認(rèn)會(huì)發(fā)出終止信號(hào)(15)。常用的信號(hào)如下:

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

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

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

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

kill 命令默認(rèn)的信號(hào)就是 15,首先來(lái)說(shuō)一下這個(gè)默認(rèn)的 kill -15 信號(hào)。

當(dāng)使用 kill -15 時(shí),系統(tǒng)會(huì)發(fā)送一個(gè) SIGTERM 的信號(hào)給對(duì)應(yīng)的程序。當(dāng)程序接收到該信號(hào)后,具體要如何處理是自己可以決定的。

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

  • 立即停止程序
  • 釋放響應(yīng)資源后停止程序
  • 忽略該信號(hào),繼續(xù)執(zhí)行程序

因?yàn)?kill -15 信號(hào)只是通知對(duì)應(yīng)的進(jìn)程要進(jìn)行"安全、干凈的退出",程序接到信號(hào)之后,退出前一般會(huì)進(jìn)行一些"準(zhǔn)備工作",如資源釋放、臨時(shí)文件清理等等,如果準(zhǔn)備工作做完了,再進(jìn)行程序的終止。

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

這也就是為什么我們有的時(shí)候使用 kill 命令是沒(méi)辦法"殺死"應(yīng)用的原因,因?yàn)槟J(rèn)的 kill 信號(hào)是 SIGTERM(15),而 SIGTERM(15) 的信號(hào)是可以被阻塞和忽略的。

和 kill -15 相比,kill -9 就相對(duì)強(qiáng)硬一點(diǎn),系統(tǒng)會(huì)發(fā)出 SIGKILL 信號(hào),他要求接收到該信號(hào)的程序應(yīng)該立即結(jié)束運(yùn)行,不能被阻塞或者忽略。

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

Java 是如何處理 SIGTERM(15) 的

我們都知道,在 Linux 中,Java 應(yīng)用是作為一個(gè)獨(dú)立進(jìn)程運(yùn)行的,Java程序的終止運(yùn)行是基于 JVM 的關(guān)閉實(shí)現(xiàn)的。

JVM 關(guān)閉方式分為三種:

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

JVM 進(jìn)程在接收到 kill -15 信號(hào)通知的時(shí)候,是可以做一些清理動(dòng)作的,比如刪除臨時(shí)文件等。

當(dāng)然,開(kāi)發(fā)者也是可以自定義做一些額外的事情的,比如讓 Tomcat 容器停止,讓 Dubbo 服務(wù)下線等。

而這種自定義 JVM 清理動(dòng)作的方式,是通過(guò) JDK 中提供的 shutdown hook 實(shí)現(xiàn)的。

JDK 提供了 Java.Runtime.addShutdownHook(Thread hook) 方法,可以注冊(cè)一個(gè) JVM 關(guān)閉的鉤子。

例子如下:

  1. package com.hollis; 
  2.  
  3.  
  4. public class ShutdownHookTest { 
  5.  
  6.  
  7.     public static void main(String[] args) { 
  8.  
  9.         boolean flag = true
  10.  
  11.         Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
  12.  
  13.             System.out.println("hook execute..."); 
  14.  
  15.         })); 
  16.  
  17.  
  18.         while (flag) { 
  19.  
  20.             // app is runing 
  21.  
  22.         } 
  23.  
  24.  
  25.         System.out.println("main thread execute end..."); 
  26.  
  27.     } 
  28.  

執(zhí)行命令:

  1. ➜ jps 
  2.  
  3. 6520 ShutdownHookTest 
  4.  
  5. 6521 Jps 
  6.  
  7. ➜ kill 6520 

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

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

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

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

  1. ➜ kill -9 6520 

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

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

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

總結(jié)

kill 命令用于終止 Linux 進(jìn)程,默認(rèn)情況下,如果不指定信號(hào),kill 等價(jià)于 kill -15。

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

有的時(shí)候,kill -15 無(wú)法終止程序,因?yàn)樗赡鼙缓雎裕@時(shí)候可以使用 kill -9,系統(tǒng)會(huì)發(fā)出 SIGKILL(9) 信號(hào),該信號(hào)不允許忽略和阻塞,所以應(yīng)用程序會(huì)立即終止。

這也會(huì)帶來(lái)很多副作用,如數(shù)據(jù)丟失等,所以,在非必要時(shí),不要使用 kill -9 命令,尤其是那些 Web 應(yīng)用、提供 RPC 服務(wù)、執(zhí)行定時(shí)任務(wù)、包含長(zhǎng)事務(wù)等應(yīng)用中。

因?yàn)?kill -9 沒(méi)給 Spring 容器、Tomcat 服務(wù)器、Dubbo 服務(wù)、流程引擎、狀態(tài)機(jī)等足夠的時(shí)間進(jìn)行收尾。

 

作者:Hollis

簡(jiǎn)介:一個(gè)對(duì) Coding 有著獨(dú)特追求的人,現(xiàn)任阿里巴巴技術(shù)專(zhuān)家,個(gè)人技術(shù)博主,技術(shù)文章全網(wǎng)閱讀量數(shù)千萬(wàn),《程序員的三門(mén)課》聯(lián)合作者。

編輯:陶家龍

出處:轉(zhuǎn)載自微信公眾號(hào) Hollis(ID:hollischuang)

 

責(zé)任編輯:武曉燕 來(lái)源: Hollis
相關(guān)推薦

2019-08-01 14:12:49

Linuxrm命令lsof命令

2019-07-29 14:38:35

服務(wù)器開(kāi)發(fā)工具

2020-10-26 08:56:32

技術(shù)總監(jiān)程序員

2021-10-07 16:45:06

MySQL數(shù)據(jù)庫(kù)

2022-10-25 17:53:09

Java線程池

2021-01-05 22:49:37

Python編程語(yǔ)言Java

2023-03-10 08:27:07

for循環(huán)項(xiàng)目線性結(jié)構(gòu)

2021-06-21 07:44:07

程序員面試職場(chǎng)

2021-07-28 05:01:29

Lombok前端測(cè)試

2016-10-17 19:14:28

2015-05-05 16:33:38

Easyrecover

2021-04-30 08:21:22

Linux管道設(shè)計(jì)

2021-05-11 16:20:02

網(wǎng)站HTTPHTTPS

2024-05-13 07:58:52

開(kāi)源項(xiàng)目PR

2021-03-03 00:02:47

服務(wù)器電源消息

2020-02-03 09:10:23

數(shù)據(jù)庫(kù)刪庫(kù)刪庫(kù)跑路

2019-06-24 10:51:01

3D打印打印機(jī)

2016-10-17 08:58:23

Windows 7殺毒賬號(hào)

2018-01-18 22:26:30

2021-01-30 09:50:54

MySQL密碼服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人一区av | 国产色爽| 色一级片| 日本成人在线免费视频 | 亚洲国产偷 | 日韩精品一区二区三区 | 欧美性生活免费 | 欧美日韩三级 | 午夜激情影院 | 羞羞色网站 | 国产成人a亚洲精品 | 日韩精品免费视频 | 大香网伊人| 精品福利一区二区三区 | 亚洲国内精品 | 不卡的av在线 | 成人伊人网 | 黑人巨大精品欧美一区二区免费 | 国产三级电影网站 | 亚洲免费观看 | 欧美性video 精品亚洲一区二区 | 亚洲一区二区三区免费在线观看 | 亚洲综合色网站 | 视频在线一区二区 | 夜夜艹| 亚洲一区综合 | 99久久精品免费看国产四区 | 国产精品欧美精品日韩精品 | 亚洲精品99 | 国产精品毛片一区二区三区 | 日韩一区二区福利 | 亚洲麻豆 | 精品国产青草久久久久福利 | 久久久国产精品视频 | av黄色国产 | 国产在线不卡 | 日韩久久综合 | 国产一区在线视频 | 国产精品亚洲精品久久 | 99国产在线 | 国产视频日韩 |