Hace un tiempo publiqué un artículo en el que hablaba sobre configurar Java Environment Options en Tomcat y las diferencias entre JAVA_OPTS y en CATALINA_OPTS. Precisamente a raíz de este tema surge el siguiente problema cuando tenemos la monitorización JMX remota activada en Tomcat e intentamos parar el servicio:
# /etc/init.d/tomcat stop Stopping tomcat: [FAILED]
Salida del log catalina.out:
Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 11111; nested exception is: java.net.BindException: Address already in use
El problema reside en que la configuración de JMX hay que establecerla dentro de la variable CATALINA_OPTS en lugar de en JAVA_OPTS. El servicio arranca correctamente independientemente donde esté declarada, pero al pararlo falla si no está establecida en CATALINA_OPTS.
Incorrecto:
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
Correcto:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
Para poder parar Tomcat cuando aparece el error y no tenemos la solución aplicada en la configuración, ejecutamos un kill contra su PID.
# kill <TOMCAT_JAVA_PID>