您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么理解kill命令”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么理解kill命令”吧!
kill 命令
我們都知道,想要在 Linux 中終止一個進程有兩種方式,如果是前臺進程可以使用 Ctrl+C 鍵進行終止;如果是后臺進程,那么需要使用kill命令來終止。(其實 Ctrl+C 也是 kill 命令)
kill 命令的格式是:
kill[參數][進程號] 如: kill 21121 kill -9 21121
其中[參數]是可選的,進程號可以通過 jps/ps/pidof/pstree/top 等工具獲取。
kill 的命令參數有以下幾種:
-l 信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱 -a 當處理當前進程時,不限制命令名和進程號的對應關系 -p 指定kill 命令只打印相關進程的進程號,而不發送任何信號 -s 指定發送信號 -u 指定用戶
通常情況下,我們使用的 -l(信號)的時候比較多,如我們前文提到的 kill -9 中的 9 就是信號。
信號如果沒有指定的話,默認會發出終止信號(15)。常用的信號如下:
HUP 1 終端斷線 INT 2 中斷(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 終止 KILL 9 強制終止 CONT 18 繼續(與STOP相反, fg/bg命令) 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 關閉的鉤子。
例子如下:
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..."); } }
執行命令:
? jps 6520 ShutdownHookTest 6521 Jps ? kill 6520
控制臺輸出內容:
hook execute... Process finished with exit code 143 (interrupted by signal 15: SIGTERM)
可以看到,當我們使用 kill(默認 kill -15)關閉進程的時候,程序會先執行我注冊的 shutdownHook,然后再退出,并且會給出一個提示:interrupted by signal 15: SIGTERM。
如果我們執行命令 kill -9:
? kill -9 6520
控制臺輸出內容:
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
可以看到,當我們使用 kill -9 強制關閉進程的時候,程序并沒有執行 shutdownHook,而是直接退出了,并且會給出一個提示:interrupted by signal 9: SIGKILL。
到此,相信大家對“怎么理解kill命令”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。