研究kill 和 kill -9 的區別
本項目有個接口/test
,請求後該接口需要處理很久。在接口還未返回結果的時候,使用kill
和kill -9
殺掉進程會怎麼樣?
- 用chrome請求
/test
,看到轉圈,執行kill -9 進程ID
,可以看到轉圈立即停止。可以想象到kill -9
是立即殺死進程,不會等待善後。 - 用chrome請求
/test
,看到轉圈,執行kill 進程ID
,可以看到繼續轉圈,但是過了一陣子界面就不轉圈停止了。可以想象到,還是會等待善後的,即會
等待還沒運行完的線程,但是因爲線程實在處理太久了,kill
是有最大等待時間的,過了這個時間還不處理完畢,就直接關閉了
上述只是看錶象,我們寫了一個 TestAnnotationPreDestroy
類監聽當springboot程序被關閉時打印一條語句,可以看到kill -9
時不打印,而kill
時會打印,這是更加客觀的證據。
kill 究竟會等待多長時間?
這個應該是操作系統會留多少時間給進程善後,具體多少,我暫時未知
actuator 的 /actuator/shutdown優雅關機,屬於哪種類型
從觀察的結果來看 /actuator/shutdown
不是 kill -9
,應該是使用 kill
來實現的,它跟 kill
是一樣的,都會等待一段時間,這短時間還執行不完就強關
kill 和 kill -9 以及 /actuator/shutdown 是不是執行後程序就不再接收新的請求?
請求/test
接口,執行以下命令,再迅速得在/test
還在轉圈的時候訪問/
接口,是不是程序就不再接收新的請求?(即/
沒響應)
- kill -9:是直接殺死,無所謂的是否還接收新請求,
/
無響應 - kill:
/
無響應,說明/test
是已有正在處理的需求,那繼續處理,但是對於/
是新請求的,就不再接收這個請求,chrome頁面直接就返回 “無法訪問此網站”(跟程序沒啓動時訪問得到的結果同) /actuator/shutdown
:同kill