1. 程式人生 > >kill 命令在Java應用中使用注意事項

kill 命令在Java應用中使用注意事項

 

前言

我們都知道,kill在linux系統中是用於殺死程序。

kill pid [..]

kill命令可將指定的訊號傳送給相應的程序或工作。 kill命令預設使用訊號為15,用於結束程序或工作。如果程序或工作忽略此訊號,則可以使用訊號9,強制殺死程序或作業.

因此,如果確保將程序殺死,可以使用-9引數

kill -9 pid [..]

而使用-3引數,可以 列印程序的執行日誌

kill -3 pid

在Java中的應用

建立一個SpringBoot的web應用

啟動類如下,添加了一個鉤子函式,當程序關閉時,將會呼叫該鉤子函式。

@SpringBootApplication
public class WebApplication {

    public static void main(String args[]){

        SpringApplication.run(WebApplication.class,args);

        Runtime.getRuntime().addShutdownHook(new Thread(){

            @Override
            public void run() {
                System.out.println("do ShutdownHook.......... ");
            }
        });
    }
}

 

 使用maven打包。

mvn package

 

 

測試kill -3 

啟動應用

這裡注意,如果使用相對路徑啟動應用,則jps看到的程序名稱為jar,使用絕對路徑如下則顯示完整的jar名稱:web-1.0.jar。

java -jar ~/aProject/web/target/web-1.0.jar

 

檢視程序pid

lgj@lgj-Lenovo-G470:~/aProject/web/target$ jps | grep web
21060 web-1.0.jar

 

使用kill -3 

lgj@lgj-Lenovo-G470:~/aProject/web/target$ kill -3 21060

 

可以看到啟動介面列印了Java應用的堆疊資訊。列印的是收到-3訊號時刻的執行緒資訊。

如果使用以下方式啟動應用

nohup java -jar ~/aProject/web/target/web-1.0.jar   &
lgj@lgj-Lenovo-G470:~/aProject/web/target$ ls -l |grep nohup.out 
-rw------- 1 lgj lgj    22811 Jun  9 00:41 nohup.out

 

可以看到啟動所在的目錄多了一個檔案nohup.out。該檔案記錄了應用啟動執行過程中的日誌。

nohup 命令 & ;

表示以後臺方式執行應用。

此時使用kill -3。列印的執行緒資訊可以到該nohup.out中檢視。

測試kill 和kill -9

啟動應用

java -jar ~/aProject/web/target/web-1.0.jar

 

使用kill pid殺死程序

lgj@lgj-Lenovo-G470:~/aProject/web/target$ jps | grep web
21470 web-1.0.jar
lgj@lgj-Lenovo-G470:~/aProject/web/target$ kill 21470
lgj@lgj-Lenovo-G470:~/aProject/web/target$ 

 

可以看到輸出日誌中輸出了鉤子函式中所列印的

do ShutdownHook.......... 
2019-06-09 01:18:28.610  INFO 21470 --- [           main] com.demo.web.WebApplication              : Started WebApplication in 4.585 seconds (JVM running for 5.274)
do ShutdownHook.......... 
2019-06-09 01:18:41.381  INFO 21470 --- [       Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

 

使用kill  -9  pid殺死程序

lgj@lgj-Lenovo-G470:~/aProject/web/target$ jps | grep web
21568 web-1.0.jar
lgj@lgj-Lenovo-G470:~/aProject/web/target$ kill -9 21568

 

最後的日誌並沒有輸出鉤子函式中的內容

2019-06-09 01:20:37.579  INFO 21568 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8452 (http) with context path ''
2019-06-09 01:20:37.585  INFO 21568 --- [           main] com.demo.web.WebApplication              : Started WebApplication in 4.171 seconds (JVM running for 4.812)
Killed

 

 

總結

在使用kill操作java應用時

1.kill -3 pid可以列印當前程序的執行緒資訊,但是不會關閉Java應用!

2.kill pid 也就是kill -15 pid ,將會呼叫鉤子函式ShutdownHook,一般ShutdownHook中會進行一些操作,比如儲存資料,關閉連線等。

3.kill  -9 pid.不會呼叫鉤子函式ShutdownHoo