真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么理解kill命令

本篇內容主要講解“怎么理解kill命令”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么理解kill命令”吧!

創(chuàng)新互聯(lián)建站于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站設計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元鹽亭做網(wǎng)站,已為上家服務,為鹽亭各地企業(yè)和個人服務,聯(lián)系電話:18982081108

kill 命令

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

kill 命令的格式是:

kill[參數(shù)][進程號] 如:  kill 21121  kill -9 21121

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

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

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

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

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

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

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

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

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

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

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

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

  • 立即停止程序

  • 釋放響應資源后停止程序

  • 忽略該信號,繼續(xù)執(zhí)行程序

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

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

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

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

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

Java 是如何處理 SIGTERM(15) 的

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

JVM 關閉方式分為三種:

  • 正常關閉:當最后一個非守護線程結束或者調用了 System.exit 或者通過其他特定平臺的方法關閉(接收到  SIGINT(2)、SIGTERM(15)信號等)

  • 強制關閉:通過調用 Runtime.halt 方法或者是在操作系統(tǒng)中強制 kill(接收到 SIGKILL(9) 信號)

  • 異常關閉:運行中遇到 RuntimeException 異常等。

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

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

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

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...");      }  }

執(zhí)行命令:

? jps  6520 ShutdownHookTest  6521 Jps  ? kill 6520

控制臺輸出內容:

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

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

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

? kill -9 6520

控制臺輸出內容:

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

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

到此,相信大家對“怎么理解kill命令”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!


網(wǎng)頁名稱:怎么理解kill命令
文章網(wǎng)址:http://weahome.cn/article/geejdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部