Tomcat作为最常用的Java Web容器,几乎每个后端开发者都绕不开它。改了server.xml配置、更新了war包、调整了JVM参数,这些操作之后往往都需要重启Tomcat才能生效。但不少人对重启的理解只停留在“关掉再开”这个层面,遇到进程关不掉、重启后起不来、端口被占用等问题就手足无措。这篇文章就把Tomcat重启的完整知识梳理一遍,覆盖Linux和Windows两大平台,顺便把常见的坑也讲清楚。

一、Linux下重启Tomcat的标准命令
在Linux环境下,Tomcat的重启依赖bin目录下的shell脚本。假设Tomcat安装在/usr/local/tomcat目录,进入bin目录后依次执行关闭和启动脚本即可完成一次重启:
cd /usr/local/tomcat/bin ./shutdown.sh ./startup.sh
shutdown.sh的本质是调用catalina.sh stop,它会连接Tomcat的shutdown端口(默认8005),发送SHUTDOWN指令让容器优雅退出。所谓优雅退出,是指Tomcat会先停止接收新请求,处理完已经在执行的请求,再依次销毁各个应用的Servlet上下文,最后释放资源退出进程。
startup.sh则调用catalina.sh start,它会在后台拉起一个JVM进程运行Tomcat。如果想在前台直接运行并实时观察日志输出,可以用catalina.sh run,这个命令会阻塞当前终端,日志直接打印在屏幕上,调试时特别有用。
两个命令也可以合并成一行执行,方便写成脚本:
/usr/local/tomcat/bin/shutdown.sh && sleep 5 && /usr/local/tomcat/bin/startup.sh
中间加一个sleep 5是给Tomcat留出关闭时间。如果shutdown.sh刚执行完立刻startup.sh,很可能出现旧进程还没退干净、新进程起不来的情况,这也是新手最容易踩的坑之一。
二、Windows下重启Tomcat的方式
Windows平台下的操作类似,只是脚本后缀换成了bat。进入Tomcat的bin目录,双击或在命令行中执行:
cd C:\tomcat\bin shutdown.bat startup.bat
shutdown.bat同样是通过shutdown端口发送停止指令,startup.bat会启动一个新的命令行窗口运行Tomcat,日志输出在这个窗口中。需要注意的是,如果直接点击startup.bat后把弹出的命令行窗口关掉,Tomcat进程也会跟着退出,这是Windows下Tomcat作为控制台程序运行的特性。
如果Tomcat是安装版并注册成了Windows服务,重启方式就不一样了。可以在“服务”管理界面中找到类似Apache Tomcat的服务项进行重启,也可以用命令行操作:
net stop Tomcat9 net start Tomcat9
服务名以实际注册的名称为准,可以在tomcat9w.exe的配置界面或者服务列表里查看。服务方式运行的好处是开机自启动、不依赖用户登录会话,生产环境的Windows服务器一般推荐这种部署形态。
三、Tomcat关不掉怎么办:强制结束进程
有时候执行完shutdown.sh,Tomcat并没有真正退出。常见原因有几个:应用中有非守护线程阻塞了JVM退出、应用的destroy方法执行很慢甚至死锁、shutdown端口配置异常导致指令发不出去。这时候需要先确认进程是否还在:
ps -ef | grep tomcat
如果输出中还能看到Tomcat的Java进程,说明关闭失败,需要强制结束:
kill -9 进程ID
进程ID就是ps输出中第二列的数字。kill -9属于强制终止,JVM没有任何善后的机会,正在处理的请求会被直接掐断,可能出现事务执行一半、临时文件残留等情况,所以它只能作为兜底手段,不能替代正常的shutdown脚本。
还有一种更彻底的批量处理写法,一行命令找出所有Tomcat进程并全部杀掉:
ps -ef | grep tomcat | grep -v grep | awk '{print $2}' | xargs kill -9这里的grep -v grep是为了把grep命令自身从结果里过滤掉,否则可能误杀无关进程。Windows下对应的操作是在任务管理器中结束java.exe进程,或者用taskkill /f /pid 进程ID命令。
四、重启后的验证与常见问题排查
重启执行完不代表万事大吉,还需要验证服务是否真正起来了。最直接的方式是看日志,打开logs/catalina.out(Windows下是logs目录里的日志文件),观察启动耗时和是否有异常堆栈。看到类似“Server startup in xxxx ms”的日志,才说明启动成功。然后可以用curl或者浏览器访问一下应用地址确认响应正常:
curl -I http://127.0.0.1:8080
端口验证也很常用。8080是Tomcat默认的HTTP端口,8005是shutdown端口,8009是AJP端口。可以用netstat -anp | grep 8080查看端口是否处于监听状态。如果重启后起不来,报“Address already in use”,基本就是旧进程没死干净占着端口,回到上一节的方法清理进程即可。
另一个经典问题是shutdown端口冲突。如果一台服务器上跑了多个Tomcat实例,server.xml里的8005端口必须各不相同,否则第二个实例的shutdown指令会打到第一个实例上,或者shutdown端口被占用导致Tomcat压根起不来。多实例部署时建议同时规划好8080、8005、8009这三个端口,避免互相干扰。
最后提一个运维上的建议:生产环境的重启操作尽量留好回退手段,重启前确认配置文件备份无误,重启过程中持续盯日志。条件允许的话,把重启动作封装成带健康检查的脚本,启动后自动探测端口和应用状态,失败则回滚并告警,比手工敲命令可靠得多。
Tomcat重启Tomcat重启命令Linux关闭Tomcat修改时间:2026-09-10 12:26:31