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

 

前言

咱們都知道,kill在linux系統中是用於殺死進程。java

kill pid [..]

kill命令可將指定的信號發送給相應的進程或工做。 kill命令默認使用信號爲15,用於結束進程或工做。若是進程或工做忽略此信號,則可使用信號9,強制殺死進程或做業.linux

所以,若是確保將進程殺死,可使用-9參數web

kill -9 pid [..]

linux 中常見的信號tomcat

 1   SIGHUP             掛起進程app

 2   SIGINT               終止進程maven

 3   SIGGQUIT    中止進程ide

 9   SIGKILL     無條件終止進程函數

15  SIGTERM          儘量終止進程測試

17  SIGSTOP           無條件中止進程,但不是終止spa

18  SIGTSTP   中止或者暫停進程,但不終止進程

19 SIGCONT   繼續運行中止的進程

 

在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 命令 & ;

&表示之後臺方式運行應用。但若是退出關閉啓動的控制檯,進程將會中止

nohup + &也是之後臺方式運行應用,可是退出關閉啓動的控制檯,進程不會中止。且進程日誌將會輸出到nohup.out中。

此時使用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.不會調用鉤子函數ShutdownHook

相關文章
相關標籤/搜索