Я привязываю использовать runit для демонстрации JBoss.
Я использую /opt/jboss-6.1.0.Final/bin/run.sh
скрипт для запуска сервера. Когда я делаю это из командной строки, JBoss не отключается (чего мы и хотим), а также закрывается при нажатии CTRL + C. Теоретически идеальный кандидат для использования runit.
Все работает нормально, кроме случаев, когда я пытаюсь запустить runit, чтобы закрыть JBoss. Когда я даю команду sv stop jboss
Ничего не произошло. Runit думает, что процесс остановлен, но jboss продолжает нормально работать.
Я не делаю ничего особенного с run
сценарий. Это мой рунит run
сценарий:
#!/bin/sh
exec 2>&1
exec /opt/jboss-6.1.0.Final/bin/run.sh -c standard -b 0.0.0.0
Глядя на jboss_init_redhat.sh
сценарий, start
в разделе упоминается ./bin/run.sh
но в разделе остановки есть следующий текст:
JBOSS_CMD_STOP=${JBOSS_CMD_STOP:-"java -classpath $JBOSSCP org.jboss.Shutdown --shutdown"}
Есть идеи, что я могу попробовать?
Для всех, кто находится в подобной ситуации, я выяснил, в чем проблема. Я объясняю, как я получил ответ, поскольку считаю, что он может помочь в решении других проблем.
После запуска JBoss с runit, если вы выполните ps aux | grep jboss
вот результат:
# 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
Теперь выполните sv status jboss
и обратите внимание на pid, который sv
отчеты:
# sv status jboss
run: jboss: (pid 1857) 17s; run: log: (pid 1856) 17s
sv
думает, что pid jboss равен 1857, но проверяет вывод ps
, фактический pid jboss - 1926, оболочка, запустившая jboss, - pid 1857. Это проблема, run.sh сценарий делает что-то забавное.
Если вы покопаетесь в run.sh script, пройдя через ужасную конкатенацию путей к классам java, вы можете найти следующий отрывок:
# Execute the JVM in the foreground
eval \"$JAVA\" $JAVA_OPTS \
-Djava.endorsed.dirs=\"$JBOSS_ENDORSED_DIRS\" \
-classpath \"$JBOSS_CLASSPATH\" \
org.jboss.Main "$@"
JBOSS_STATUS=$?
Он использует eval
вместо того exec
выполнить jvm! Вот почему он порождает отдельный процесс, и runit не может его правильно контролировать.
Просто измените эту часть скрипта на:
# Execute the JVM in the foreground
exec ${JAVA} $JAVA_OPTS \
-Djava.endorsed.dirs=${JBOSS_ENDORSED_DIRS} \
-classpath ${JBOSS_CLASSPATH} \
org.jboss.Main "$@"
JBOSS_STATUS=$?
И ПРЕСТО! Призыв к exec
заменит себя выполняемым процессом, и runit сможет правильно управлять процессом.
Когда я заменил eval командой exec, я получаю исключение ниже, хотя java dir правильный, а eval работает хорошо. Проблема в том, что когда я использую eval, 2 процессы запускаются при запуске jboss. пожалуйста посоветуй. ./standalone.sh: 289: exec: "/app/dms/java/jdk1.7.0_60/bin/java": не найдено