tomcat shutdown 後常常會發現仍然有進程存在,其中tomcat/bin 目錄下的catalina.sh是比較經常使用的shell,通常開啓關閉tomcat操做以下:java
1程序員 2shell 3apache 4bootstrap |
|
可是每每一個工程,開發一段時間後,會發現./catalina.sh stop關閉不了tomcat,而必須使用kill -9 <pid> 這樣的強制命令去
殺死tomcat,這麼作固然能夠,可是手法不是那麼的優雅
在tomat未被./catalina stop關閉的狀況下,致使誤覺得tomcat已經關閉成功的哥們 會在更新完代碼後,./catalina start一下,因而在服務器中就產生了2個tomcat的實例,log混亂,然後每次都用kill -9 <pid> 才放心。
其實不用那樣,通常關閉不了的狀況,是因爲程序員本身在tomcat中開啓了新的線程,並且未設置成daemon,形成的主線程不能退出.
怎麼發現工程裏到底哪裏開啓的新的非守護線程呢,其實jdk提供了jstack工具,能夠幫助咱們分析
查看方法很簡單
$JAVA_HOME/bin/jstack <pid>
pid是指進程ID, 用ps -ef|grep tomcat 就能夠查看到:
spa
1 2 3 |
|
這裏看到的進程ID是 1513
調用jstack查看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
其中看到"Attach Listener" daemon prio=10 tid=0xb41d7c00 nid=0x606 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
這行,最前變的"Attach Listener" 是線程名, 緊跟其後的 daemon是線程的守護狀態,
其中主線程不是daemon的,因此是這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
在"main" 後沒有daemon,看到這樣的線程狀態,順藤摸瓜,找到對應new Thread的地方setDaemon(true)就能夠,痛痛快快的./catalina stop了