«Port already in use» al parar Tomcat con JMX activado

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>