tomcat 意外终止

本文详细解析了在使用xshell重启Tomcat后,如何通过脚本实现作业控制,防止直接关闭Tomcat导致的进程退出问题。讨论了交互模式与非交互模式下SIGINT信号处理的不同机制,解释了为什么在交互模式下SIGINT信号会被忽略,以及非交互模式下如何通过设置忽略SIGINT信号避免不必要的进程退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用xshell 时 重启tomcat 后 不ctrl + c ,直接点击右上角‘X’ , 这是tomcat 会 退出进程。


restart_tomcat.sh 脚本:

ps -ef|grep '^.*java.*'"apache-tomcat-$1"'.*$'|grep -v grep|awk '{print $2}'|xargs kill -9
/opt/apache-tomcat-$1/bin/startup.sh
tail -f /opt/apache-tomcat-$1/logs/catalina.out


改过之后:
ps -ef|grep '^.*java.*'"apache-tomcat-$1"'.*$'|grep -v grep|awk '{print $2}'|xargs kill -9

set -m

/opt/apache-tomcat-$1/bin/startup.sh
tail -f /opt/apache-tomcat-$1/logs/catalina.out


注: 增加作业控制。

详解:http://hongjiang.info/why-kill-2-cannot-stop-tomcat/

交互模式与非交互模式对作业控制(job control)默认方式不同

为什么在交互模式下shell不会对后台进程处理SIGINT信号设置为忽略,而非交互模式下会设置为忽略呢?还是比较好理解的,举例来说,我们先某个前台进程运行时间太长,可以ctrl-z中止一下,然后通过bg %n把这个进程放入后台,同样也可以把一个cmd &方式启动的后台进程,通过fg %n放回前台,然后在ctrl-c停止它,当然不能忽略SIGINT

为何交互模式下的后台进程会设置一个自己的进程组ID呢?因为默认如果采用父进程的进程组ID,父进程会把收到的键盘事件比如ctrl-c之类的SIGINT传播给进程组中的每个成员,假设后台进程也是父进程组的成员,因为作业控制的需要不能忽略SIGINT,你在终端随意ctrl-c就可能导致所有的后台进程退出,显然这样是不合理的;所以为了避免这种干扰后台进程设置为自己的pgid。

而非交互模式下,通常是不需要作业控制的,所以作业控制在非交互模式下默认也是关闭的(当然也可以在脚本里通过选项set -m打开作业控制选项)。不开启作业控制的话,脚本里的后台进程可以通过设置忽略SIGINT信号来避免父进程对组中成员的传播,因为对它来说这个信号已经没有意义。

回到tomcat的例子,catalina.sh脚本通过start参数启动的时候,就是以非交互方式后台启动,java进程也被shell设置了忽略SIGINT信号,因此在ctrl-c结束test.sh进程时,系统发送的SIGINT对java没有影响。




### 查询并终止 Tomcat 进程的 Linux 命令 在 Linux 系统中,查询并终止 Tomcat 进程是常见的运维操作。可以通过 `ps` 和 `grep` 命令组合查找 Tomcat 的进程 ID(PID),然后使用 `kill` 命令终止该进程。 #### 查询 Tomcat 进程 使用以下命令查找 Tomcat 的进程: ```bash ps -ef | grep tomcat ``` 该命令会列出所有与 "tomcat" 相关的进程信息,其中第二列是进程 ID(PID)。可以结合 `grep -v "grep"` 排除掉 `grep` 自身的进程: ```bash ps -ef | grep tomcat | grep -v "grep" ``` #### 终止 Tomcat 进程 找到 Tomcat 的 PID 后,可以使用 `kill` 命令终止进程。首先尝试使用 `SIGTERM` 信号,允许 Tomcat 进行正常关闭和资源释放: ```bash kill <PID> ``` 如果 Tomcat 进程未响应,可以使用 `SIGKILL` 强制终止进程: ```bash kill -9 <PID> ``` #### 自动化脚本终止 Tomcat 以下是一个自动化脚本,用于查找并终止 Tomcat 进程: ```bash #!/bin/bash # 获取Tomcat进程 tomcat_pid=$(ps -ef | grep tomcat | grep -v "grep" | awk '{print $2}') if [ -n "$tomcat_pid" ]; then echo "Tomcat PID: $tomcat_pid" kill -9 $tomcat_pid echo "Tomcat process killed" else echo "No Tomcat process found" fi ``` 此脚本会自动检测 Tomcat 进程是否存在,并使用 `kill -9` 强制终止[^2]。 #### 注意事项 在终止 Tomcat 进程时,应优先使用 `SIGTERM` 信号,以便让 Tomcat 有机会完成清理工作,避免数据丢失或服务异常。只有在进程无响应时,才应使用 `SIGKILL` 强制终止[^3]。 此外,终止 Tomcat 后,应检查 `catalina.out` 日志文件,确认是否有异常终止记录,如未正常关闭的日志信息。这有助于排查 Tomcat 是否因系统资源限制或外部信号被意外终止[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值