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
故障排查
第一步:确认端口被谁占用
[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作为第一个参数传递出去。