Tomcat 10+JDK21:执行version.sh报JMX端口占用故障复盘

摘要:保哥查看Tomcat版本的时候,习惯使用version.sh脚本。可以将Tomcat启动时候需要的信息都展示出来。近期在RHEL9.8系统中新部署的Tomcat10.1.57+OpenJDK21环境执行该命令时,显示JMX端口被占用了。查个版本为什么会报端口占用呢?…

t启动时候需要的信息都展示出来。近期在RHEL9t10.1.57+OpenJDK21环境执行该命令时,显示JMX端口被占用了。查个版本为什么会报端口占用呢?

先决条件

  • 操作系统:Red Hat Enterprise Linux release 9.8 (Plow)

  • JDK:openjdk version "21.0.12.1" 2026-08-18 LTS

  • t:10.1.57

故障现象

t进程正常运行。执行./version.sht与JDK版本时,直接抛出JMX端口占用报错:

Using CATALINA_BASE:   /home/app01/tomcat1
Using CATALINA_HOME:   /home/app01/tomcat1
Using CATALINA_TMPDIR: /home/app01/tomcat1/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /home/app01/tomcat1/bin/bootstrap.jar:/home/app01/tomcat1/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Using CATALINA_PID:    /home/app01/tomcat1/run/tomcat.pid
Error: JMX connector server communication error: service:jmx:rmi://fushengbao.com:8104
jdk.internal.agent.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 8104; nested exception is:
        java.net.BindException: Address already in use

微信图片_2026-10-15_110231_888.png

故障排查

第一步:确认端口被谁占用

[root@fushengbao.com ~]# ss -ltnp | grep 8104
LISTEN 0      100                     :8104             :*    users:(("java",pid=3006261,fd=45))  
[root@fushengbao.com ~]# ps aux|grep 3006261
app01    3006261  0.1 10.4 5703400 1673424 ?     Sl   Oct10   7:01 /usr/lib/jvm/java-21-openjdk-21.0.12.1.1-1.2.el9.x86_64/bin/java -Djava.util.logging.config.file=/home/app01/tomcat1/conf/logging.properties
......

通过上面的查询结果,8104端口是被已经在运行的tomcat占用了。在这里保哥有点疑问,为什么查看个版本会提示端口冲突呢,接着往下查。

第二步:分析version.sh脚本逻辑

很多人直觉认为version.sh只是读取个版本号,是轻量无负担操作。 摊开version.sh脚本看源码,脚本最终执行:

[app01@fushengbao.com bin]$ cat version.sh
...
exec "PRGDIR"/"EXECUTABLE" version "$@"

结合上下文,这段的作用是用catalina.sh替换当前进程,并将version作为第一个参数传递出去。

第三步:梳理catalina.sh version

该内容为订阅用户专属

阅读更多解锁完整内容

广告

发表评论

登录后参与评论

登录或注册账号,与作者和其他读者互动交流