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了