前言
我們都知道,kill在linux系統中是用於殺死程式。
kill pid [..]
kill命令可將指定的訊號傳送給相應的程式或工作。 kill命令預設使用訊號為15,用於結束程式或工作。如果程式或工作忽略此訊號,則可以使用訊號9,強制殺死程式或作業.
因此,如果確保將程式殺死,可以使用-9引數
kill -9 pid [..]
linux 中常見的訊號
1 SIGHUP 掛起程式
2 SIGINT 終止程式
3 SIGGQUIT 停止程式
9 SIGKILL 無條件終止程式
15 SIGTERM 儘可能終止程式
17 SIGSTOP 無條件停止程式,但不是終止
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。