Tomcat Shutdown报错问题分析与解决方案
一、Tomcat Shutdown报错原因及现象
1、端口配置问题:
修改了Tomcat的默认shutdown端口,导致无法正常关闭。
server.xml文件中的<Server port="8005" shutdown="SHUTDOWN">
配置被更改。
2、内存泄露和线程未正确关闭:
在执行shutdown命令后,Tomcat关联的Java进程仍然存活。
日志中出现内存泄漏警告,例如JDBC驱动未正确注销或线程未停止。
3、非守护线程存在:
项目中存在非守护线程,这些线程在Tomcat关闭时未能自动终止。
解决方案
1、检查并恢复默认端口配置:
确保server.xml中的端口配置为默认值:
```xml
<Server port="8005" shutdown="SHUTDOWN">
```
2、强制关闭进程:
临时解决方案是使用kill 9 PID
命令强制杀死Tomcat进程。
更持久的解决方案是在catalina.sh脚本中记录Tomcat进程ID,并在shutdown.sh脚本中使用该PID进行强制关闭。
3、处理非守护线程:
从程序上根本解决,将项目中所有非守护线程设置为守护线程:
```java
new Thread(new RunnaBLe() {
public void run() {
// Your code here
}
}).setDaemon(true).start();
```
或者在Tomcat的shutdown.sh脚本中添加force
参数以强制关闭。
4、优化shutdown端口的安全性:
更改默认的shutdown端口号和关闭命令,增加攻击者通过shutdown请求攻击服务器的难度。
将shutdown命令改为一个复杂的字符串:
```xml
<Server port="2724" shutdown="xxx!!ydtgertsfd34g">
```
或者直接禁用shutdown端口:
```xml
<Server port="2724" shutdown="1">
```
验证解决方案
1、启动Tomcat服务:
进入Tomcat的bin目录,执行./startup.sh
启动Tomcat服务。
确认启动过程中使用了CATALINA_PID。
2、关闭Tomcat服务:
执行./shutdown.sh
关闭Tomcat服务。
确认关闭过程中已经kill掉了Tomcat进程。
3、检查进程状态:
使用ps ef | grep tomcat
查看,确认Tomcat进程已经不存在了。
相关问答FAQs
1、为什么在Linux下有时shutdown.sh不能关闭Tomcat进程?
这通常是因为项目中存在非守护线程,这些线程在Tomcat关闭时未能自动终止,解决方法包括将这些线程设置为守护线程,或者在shutdown.sh脚本中使用force
参数强制关闭进程。
2、如何防止Tomcat的shutdown端口被恶意利用?
可以通过更改默认的shutdown端口号和关闭命令来增加攻击难度,将shutdown命令改为一个复杂的字符串,或者直接禁用shutdown端口,确保这些更改在关闭Tomcat的情况下进行,以避免无法正常关闭的问题。