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

報告老板,我不小心執行了kill -9命令

開發 前端 開發工具
相信很多程序員對于Linux系統都不陌生,即使自己的日常開發機器不是Linux,那么線上服務器也大部分都是的,所以,掌握常用的 Linux 命令也是程序員必備的技能。

 相信很多程序員對于Linux系統都不陌生,即使自己的日常開發機器不是Linux,那么線上服務器也大部分都是的,所以,掌握常用的 Linux 命令也是程序員必備的技能。

[[326593]]

圖片來自 Pexels

但是,怕就怕很多人對于部分命令只是一知半解,使用不當就能導致線上故障。

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

但是在重啟過程中,同事發現正常的重啟命令應用無反應,然后嘗試使用 kill 命令"殺"掉 Java 進程,但是仍然無效。于是他私自決定使用 "kill -9"結束了進程的生命。

雖然應用進程被干掉了,但是隨之而來帶來了很多問題,首先是上游系統突然發生大量報警,對應開發找過來說調用我們的 RPC 服務無響應,頻繁超時。

后來,我們又發現系統中存在部分臟數據,有些在同一個事務中需要完整更新的數據,只更新了一半…

為什么正常的 kill 無法"殺掉"進程,而 kill -9 就可以?為什么 kill -9 會引發這一連串連鎖反應?正常的 kill 執行時,JVM 會如何處理的呢?

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

kill 命令

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

kill 命令的格式是:

  1. kill[參數][進程號] 
  2. 如:  
  3. kill 21121  
  4. kill -9 21121 

其中[參數]是可選的,進程號可以通過 jps/ps/pidof/pstree/top 等工具獲取。

kill 的命令參數有以下幾種:

  1. -l 信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱 
  2. -a 當處理當前進程時,不限制命令名和進程號的對應關系 
  3. -p 指定kill 命令只打印相關進程的進程號,而不發送任何信號 
  4. -s 指定發送信號 
  5. -u 指定用戶 

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

信號如果沒有指定的話,默認會發出終止信號(15)。常用的信號如下:

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

比較常用的就是強制終止信號:9 和終止信號:15,另外,中斷信號:2 其實就是我們前文提到的 Ctrl+C 結束前臺進程。

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

kill -9 和 kill -15 的區別

kill 命令默認的信號就是 15,首先來說一下這個默認的 kill -15 信號。

當使用 kill -15 時,系統會發送一個 SIGTERM 的信號給對應的程序。當程序接收到該信號后,具體要如何處理是自己可以決定的。

這時候,應用程序可以選擇:

  • 立即停止程序
  • 釋放響應資源后停止程序
  • 忽略該信號,繼續執行程序

因為 kill -15 信號只是通知對應的進程要進行"安全、干凈的退出",程序接到信號之后,退出前一般會進行一些"準備工作",如資源釋放、臨時文件清理等等,如果準備工作做完了,再進行程序的終止。

但是,如果在"準備工作"進行過程中,遇到阻塞或者其他問題導致無法成功,那么應用程序可以選擇忽略該終止信號。

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

和 kill -15 相比,kill -9 就相對強硬一點,系統會發出 SIGKILL 信號,他要求接收到該信號的程序應該立即結束運行,不能被阻塞或者忽略。

所以,相比于 kill -15 命令,kill -9 在執行時,應用程序是沒有時間進行"準備工作"的,所以這通常會帶來一些副作用,數據丟失或者終端無法恢復到正常狀態等。

Java 是如何處理 SIGTERM(15) 的

我們都知道,在 Linux 中,Java 應用是作為一個獨立進程運行的,Java程序的終止運行是基于 JVM 的關閉實現的。

JVM 關閉方式分為三種:

  • 正常關閉:當最后一個非守護線程結束或者調用了 System.exit 或者通過其他特定平臺的方法關閉(接收到 SIGINT(2)、SIGTERM(15)信號等)
  • 強制關閉:通過調用 Runtime.halt 方法或者是在操作系統中強制 kill(接收到 SIGKILL(9) 信號)
  • 異常關閉:運行中遇到 RuntimeException 異常等。

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

當然,開發者也是可以自定義做一些額外的事情的,比如讓 Tomcat 容器停止,讓 Dubbo 服務下線等。

而這種自定義 JVM 清理動作的方式,是通過 JDK 中提供的 shutdown hook 實現的。

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

例子如下:

  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.  

執行命令:

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

控制臺輸出內容:

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

可以看到,當我們使用 kill(默認 kill -15)關閉進程的時候,程序會先執行我注冊的 shutdownHook,然后再退出,并且會給出一個提示:interrupted by signal 15: SIGTERM。

如果我們執行命令 kill -9:

  1. ➜ kill -9 6520 

控制臺輸出內容:

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

可以看到,當我們使用 kill -9 強制關閉進程的時候,程序并沒有執行 shutdownHook,而是直接退出了,并且會給出一個提示:interrupted by signal 9: SIGKILL。

總結

kill 命令用于終止 Linux 進程,默認情況下,如果不指定信號,kill 等價于 kill -15。

kill -15 執行時,系統向對應的程序發送 SIGTERM(15) 信號,該信號是可以被執行、阻塞和忽略的,所以應用程序接收到信號后,可以做一些準備工作,再進行程序終止。

有的時候,kill -15 無法終止程序,因為他可能被忽略,這時候可以使用 kill -9,系統會發出 SIGKILL(9) 信號,該信號不允許忽略和阻塞,所以應用程序會立即終止。

這也會帶來很多副作用,如數據丟失等,所以,在非必要時,不要使用 kill -9 命令,尤其是那些 Web 應用、提供 RPC 服務、執行定時任務、包含長事務等應用中。

因為 kill -9 沒給 Spring 容器、Tomcat 服務器、Dubbo 服務、流程引擎、狀態機等足夠的時間進行收尾。

 

作者:Hollis

簡介:一個對 Coding 有著獨特追求的人,現任阿里巴巴技術專家,個人技術博主,技術文章全網閱讀量數千萬,《程序員的三門課》聯合作者。

編輯:陶家龍

出處:轉載自微信公眾號 Hollis(ID:hollischuang)

 

責任編輯:武曉燕 來源: Hollis
相關推薦

2019-08-01 14:12:49

Linuxrm命令lsof命令

2019-07-29 14:38:35

服務器開發工具

2020-10-26 08:56:32

技術總監程序員

2021-10-07 16:45:06

MySQL數據庫

2022-10-25 17:53:09

Java線程池

2021-01-05 22:49:37

Python編程語言Java

2016-10-17 19:14:28

2023-03-10 08:27:07

for循環項目線性結構

2021-06-21 07:44:07

程序員面試職場

2021-07-28 05:01:29

Lombok前端測試

2021-04-30 08:21:22

Linux管道設計

2015-05-05 16:33:38

Easyrecover

2020-02-03 09:10:23

數據庫刪庫刪庫跑路

2019-06-24 10:51:01

3D打印打印機

2016-10-17 08:58:23

Windows 7殺毒賬號

2021-05-11 16:20:02

網站HTTPHTTPS

2024-05-13 07:58:52

開源項目PR

2021-03-03 00:02:47

服務器電源消息

2021-01-30 09:50:54

MySQL密碼服務器

2018-01-18 22:26:30

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线 | 国产1页 | 国产一区二区在线免费观看 | 淫片一级国产 | 亚洲国产成人精品女人久久久野战 | 亚洲成人综合网站 | 亚洲三级在线 | 欧美黄色一区 | 黄色永久免费 | 日本一二区视频 | 精品久久久久久久久久久久 | 国产欧美在线 | 欧美性吧 | 久久精品成人 | 欧美国产日韩在线 | 国产精品免费一区二区 | 久久精品小视频 | 91在线视频国产 | 妞干网视频 | 久久精品 | 国产在线视频一区二区 | 亚洲精品在线视频 | 国产精品a一区二区三区网址 | 夜夜骚视频 | 亚洲日本一区二区 | 久久国产精品久久久久久 | av一级久久 | 日韩精品成人 | 羞羞视频免费观看入口 | 中文字幕在线免费观看 | 亚洲国产精品激情在线观看 | 欧美国产日韩在线 | 97福利在线 | 99re在线视频 | 亚洲高清成人在线 | 中文字幕成人av | 91免费观看国产 | 激情五月综合网 | 日韩午夜| 99热精品在线观看 | 久久久久久久久久久成人 |