Executando o JBoss 6 com Runit / daemontools ou outra estrutura de supervisão de processo

1

Eu estou tentando usar o runit para daemonizar o JBoss.

Eu uso o script /opt/jboss-6.1.0.Final/bin/run.sh para iniciar o servidor. Quando faço isso a partir da linha de comando, o JBoss não desanexa (que é o que queremos) e também desligará quando CTRL + C for pressionado. Em teoria, um candidato perfeito para usar o runit.

Tudo funciona bem, exceto quando eu tento fazer runit para desligar o JBoss. Quando eu emito o comando sv stop jboss nada acontece. O Runit acha que o processo está parado, mas o jboss continua a rodar normalmente.

Não estou fazendo nada de especial com o script run . Este é o meu script runit run :

#!/bin/sh
exec 2>&1
exec /opt/jboss-6.1.0.Final/bin/run.sh -c standard -b 0.0.0.0

Observando o script jboss_init_redhat.sh , a seção start menciona ./bin/run.sh , mas a seção stop tem o seguinte texto:

JBOSS_CMD_STOP=${JBOSS_CMD_STOP:-"java -classpath $JBOSSCP org.jboss.Shutdown --shutdown"}

Alguma idéia do que eu poderia tentar?

    
por Alex Recarey 09.01.2012 / 19:30

2 respostas

1

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.

    
por 10.01.2012 / 12:01
0

Quando substituí eval pelo comando exec, estou ficando abaixo da exceção, embora o java dir esteja correto e o eval esteja funcionando bem. A questão é ver quando eu uso os processos do eval 2 quando o jboss é iniciado. Conselho por favor. ./standalone.sh: 289: exec: "/app/dms/java/jdk1.7.0_60/bin/java": não encontrado

    
por 02.06.2014 / 23:16