添加javaagent后Tomcat无法关闭:-javaagent处理失败问题求助
Tomcat结合Prometheus监控时shutdown失败的解决方法
关键信息
- Tomcat的catalina.bat路径:
E:\work-tomcat\apache-tomcat-9.0.71\bin - jmx_prometheus_javaagent-0.17.2.jar路径:
F:/work-Grafana/jmx_prometheus_javaagent-0.17.2.jar - catalina.bat修改内容:
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -javaagent:F:/work-Grafana/jmx_prometheus_javaagent-0.17.2.jar=2023:F:/work-Grafana/prometheus-2.42.0.windows-amd64/jmx-exporter.yaml" - Prometheus配置(prometheus.yml):
job_name: "tomcat" static_configs: - targets: ["127.0.0.1:2023"] - 启动状态:Tomcat与Prometheus启动正常,监控功能正常
- 关闭时报错:
E:\work-tomcat\apache-tomcat-9.0.71\bin>shutdown.bat Using CATALINA_BASE: "E:\work-tomcat\apache-tomcat-9.0.71" Using CATALINA_HOME: "E:\work-tomcat\apache-tomcat-9.0.71" Using CATALINA_TMPDIR: "E:\work-tomcat\apache-tomcat-9.0.71\temp" Using JRE_HOME: "C:\Program Files\Java\jdk1.8.0_201" Using CLASSPATH: "E:\work-tomcat\apache-tomcat-9.0.71\bin\bootstrap.jar;E:\work-tomcat\apache-tomcat-9.0.71\bin\tomcat-juli.jar" Using CATALINA_OPTS: "" Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386) at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401) Caused by: java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:433) at sun.nio.ch.Net.bind(Net.java:425) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) at sun.net.httpserver.ServerImpl.<init>(ServerImpl.java:100) at sun.net.httpserver.HttpServerImpl.<init>(HttpServerImpl.java:50) at sun.net.httpserver.DefaultHttpServerProvider.createHttpServer(DefaultHttpServerProvider.java:35) at com.sun.net.httpserver.HttpServer.create(HttpServer.java:130) at io.prometheus.jmx.shaded.io.prometheus.client.exporter.HTTPServer.<init>(HTTPServer.java:396) at io.prometheus.jmx.JavaAgent.premain(JavaAgent.java:31) ... 6 more FATAL ERROR in native method: processing of -javaagent failed
问题原因
shutdown.bat执行时会继承JAVA_OPTS配置,尝试加载jmx_prometheus_javaagent并绑定2023端口,但此时Tomcat主进程已经占用了该端口,导致端口绑定失败,最终抛出错误。
解决方案
将javaagent的配置从JAVA_OPTS迁移到CATALINA_OPTS中。CATALINA_OPTS仅作用于Tomcat的主服务进程,shutdown.bat不会读取该变量,因此不会重复加载agent和绑定端口。
修改catalina.bat中的配置行:
set "CATALINA_OPTS=%CATALINA_OPTS% %JSSE_OPTS% -javaagent:F:/work-Grafana/jmx_prometheus_javaagent-0.17.2.jar=2023:F:/work-Grafana/prometheus-2.42.0.windows-amd64/jmx-exporter.yaml"
修改完成后重启Tomcat,之后执行shutdown.bat即可正常关闭服务。
内容的提问来源于stack exchange,提问作者SleepingBug
相关产品推荐
相关产品推荐

