在Linux系统中停止Tomcat服务是日常运维中的常见操作,根据Tomcat的启动方式和部署环境不同,停止方法也存在差异,正确的停止操作可以避免数据丢失或服务异常,下面将详细介绍几种主流的停止方法及注意事项。
使用Tomcat自带脚本停止(推荐方式)
Tomcat提供了shutdown.sh
和catalina.sh
两个脚本用于停止服务,这是最常用且安全的方式,尤其适用于手动部署或通过startup.sh
启动的Tomcat实例。
操作步骤:
-
确认Tomcat安装路径
通常Tomcat解压后的目录为/usr/local/tomcat
(或自定义路径),进入Tomcat的bin
目录:cd /usr/local/tomcat/bin
-
执行停止脚本
-
方法1:使用
shutdown.sh
直接执行该脚本会向Tomcat主进程发送SHUTDOWN
信号(信号码为-15
),触发优雅停止:./shutdown.sh
成功执行后,控制台会输出类似信息:
Using CATALINA_BASE: /usr/local/tomcat
,且Tomcat不再监听默认端口(如8080)。 -
方法2:使用
catalina.sh stop
catalina.sh
是Tomcat的核心脚本,通过stop
参数可实现停止功能,效果与shutdown.sh
一致:./catalina.sh stop
若需强制停止(不推荐),可添加
-force
参数:./catalina.sh stop -force
,相当于直接终止进程。
-
-
验证停止状态
检查Tomcat进程是否已退出:ps -ef | grep tomcat
若无相关进程输出,说明停止成功;若仍有进程残留,需结合
kill
命令处理(后文详述)。
通过kill
命令强制停止
当Tomcat服务异常(如无响应)或脚本停止失效时,可通过kill
命令直接终止进程,但需注意,强制停止可能导致未完成的数据写入丢失,建议优先尝试优雅停止。
操作步骤:
-
查找Tomcat进程PID
使用ps
或jps
命令定位Tomcat主进程的PID:# 方法1:通过进程名过滤(需排除grep自身进程) ps -ef | grep tomcat | grep -v grep # 方法2:使用jps(需安装JDK,推荐) jps -l
输出结果中,
org.apache.catalina.startup.Bootstrap
对应的PID即为Tomcat主进程。 -
发送停止信号
-
优雅停止(优先推荐):发送
SIGTERM
信号(信号码为15
),允许进程完成当前任务后退出:kill <PID>
kill 12345
。 -
强制停止(仅限紧急情况):发送
SIGKILL
信号(信号码为9
),直接终止进程,不执行清理操作:kill -9 <PID>
-
-
确认进程终止
执行ps -ef | grep tomcat
再次检查,若PID消失则说明停止成功。
使用systemctl
管理(适用于系统服务)
若Tomcat通过systemd
配置为系统服务(如通过yum
安装或手动创建服务文件),可通过systemctl
命令统一管理。
操作步骤:
-
停止Tomcat服务
sudo systemctl stop tomcat
(注:服务名称可能为
tomcat9
、apache-tomcat
等,需根据实际配置调整。) -
检查服务状态
sudo systemctl status tomcat
若显示
Active: inactive (dead)
,说明服务已停止。 -
禁用自启动(可选)
若需长期停止Tomcat并禁止开机自启,可执行:sudo systemctl disable tomcat
不同停止方法对比
为方便选择,以下通过表格总结三种主流方法的适用场景及特点:
方法 | 适用场景 | 命令示例 | 注意事项 |
---|---|---|---|
Tomcat自带脚本停止 | 手动启动的Tomcat,需优雅停止 | ./shutdown.sh 或./catalina.sh stop |
需确保CATALINA_HOME 路径正确,检查日志确认停止 |
kill 命令停止 |
脚本失效或服务异常,需强制终止 | kill -9 <PID> |
强制停止可能导致数据丢失,优先尝试SIGTERM |
systemctl 管理 |
配置为系统服务的Tomcat(如yum安装) | sudo systemctl stop tomcat |
需确保服务文件配置正确,依赖关系完整 |
注意事项
-
检查端口释放情况
停止Tomcat后,若端口仍被占用(如8080),可通过netstat
或ss
命令排查:netstat -tuln | grep 8080 ss -tuln | grep 8080
若有进程占用,需用
kill
终止该进程。 -
查看日志确认停止原因
若停止失败,可查看Tomcat日志文件(logs/catalina.out
或logs/localhost.log
),定位错误信息:tail -f /usr/local/tomcat/logs/catalina.out
-
避免频繁强制停止
强制停止(kill -9
)会跳过JVM的关闭钩子,可能导致临时文件未清理或数据损坏,仅在服务完全无响应时使用。
相关问答FAQs
Q1:停止Tomcat后端口仍被占用,如何处理?
A:端口残留通常是因为Tomcat进程未完全退出或有子进程未终止,可按以下步骤处理:
- 用
lsof -i:8080
(或目标端口)查看占用端口的进程PID; - 执行
kill <PID>
终止进程; - 若仍无法释放,用
netstat -anp | grep 8080
确认PID后,强制终止kill -9 <PID>
。
若问题反复出现,需检查Tomcat配置中是否包含<Connector>
端口冲突,或查看是否有其他程序(如nginx)代理了Tomcat端口。
Q2:执行shutdown.sh
后进程未停止,可能的原因及解决方法?
A:shutdown.sh
失效的常见原因及解决方案如下:
- 进程非
startup.sh
启动:若Tomcat通过catalina.sh run
或nohup
启动,shutdown.sh
可能无法识别进程,此时需用jps -l
找到PID,通过kill
终止; - 端口冲突:若8080端口被其他程序占用,Tomcat可能无法正确接收停止信号,需先释放端口,再执行停止命令;
- 权限不足:若Tomcat进程由其他用户(如
tomcat
用户)启动,当前用户可能无权限终止,需切换到对应用户执行kill
,或使用sudo kill -9 <PID>
。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/29660.html