91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解kill命令

發布時間:2021-11-02 17:39:36 來源:億速云 閱讀:177 作者:iii 欄目:web開發

本篇內容主要講解“怎么理解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命令”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凯里市| 手机| 莱阳市| 岳普湖县| 通辽市| 孙吴县| 行唐县| 嵩明县| 德保县| 冷水江市| 邢台市| 平乐县| 丽水市| 阳高县| 蕉岭县| 基隆市| 巴彦淖尔市| 松滋市| 普定县| 融水| 平陆县| 道孚县| 灵武市| 彩票| 南京市| 松溪县| 滁州市| 长泰县| 万安县| 乌拉特中旗| 陈巴尔虎旗| 政和县| 乌海市| 定结县| 华蓥市| 华安县| 天祝| 介休市| 大理市| 铅山县| 曲阳县|