Para qualquer um que tenha um problema semelhante, descobri qual era o problema. Estou explicando como cheguei à resposta, pois acho que isso pode ajudar a resolver outros problemas.
Depois de iniciar o JBoss com o runit, se você executar ps aux | grep jboss
, este é o resultado:
# ps aux | grep jboss
root 1855 0.0 0.0 120 24 ? Ss 11:23 0:00 runsv jboss
root 1856 0.0 0.0 144 44 ? S 11:23 0:00 svlogd -tt /var/log/jboss
root 1857 0.0 0.0 10820 1168 ? S 11:23 0:00 /bin/sh /opt/jboss-6.1.0.Final/bin/run.sh -c standard -b 0.0.0.0
root 1926 178 1.9 1501080 78560 ? Sl 11:23 0:05 java -server -Xms128m -Xmx1024m -XX:MaxPermSize=256m -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -Djava.net.preferIPv4Stack=true -Dprogram.name=run.sh -Dlogging.configuration=file:/opt/jboss-6.1.0.Final/bin/logging.properties -Djava.library.path=/opt/jboss-6.1.0.Final/bin/native/lib64 -Djava.endorsed.dirs=/opt/jboss-6.1.0.Final/lib/endorsed -classpath /opt/jboss-6.1.0.Final/bin/run.jar org.jboss.Main -c standard -b 0.0.0.0
root 1950 0.0 0.0 61224 764 pts/0 S+ 11:23 0:00 grep jboss
Agora execute sv status jboss
e observe o pid que sv
informa:
# sv status jboss
run: jboss: (pid 1857) 17s; run: log: (pid 1856) 17s
sv
acha que o jboss 'pid é 1857, mas verificando a saída de ps
, o jboss pid real é 1926, o shell que iniciou o jboss é pid é 1857. Esse é o problema, a execução . sh script está fazendo algo engraçado.
Se você pesquisar o script run.sh , após vasculhar a horrível concatenação do caminho de classe java, poderá encontrar a seguinte extração:
# Execute the JVM in the foreground
eval \"$JAVA\" $JAVA_OPTS \
-Djava.endorsed.dirs=\"$JBOSS_ENDORSED_DIRS\" \
-classpath \"$JBOSS_CLASSPATH\" \
org.jboss.Main "$@"
JBOSS_STATUS=$?
Está usando eval
em vez de exec
para executar o jvm! É por isso que ele gera um processo separado e o runit não pode controlá-lo corretamente.
Basta alterar essa parte do script para:
# Execute the JVM in the foreground
exec ${JAVA} $JAVA_OPTS \
-Djava.endorsed.dirs=${JBOSS_ENDORSED_DIRS} \
-classpath ${JBOSS_CLASSPATH} \
org.jboss.Main "$@"
JBOSS_STATUS=$?
E pronto! A chamada para exec
será substituída pelo processo executado e o runit poderá controlar o processo corretamente.