使用 Runit/daemontools 或其他进程监控框架运行 JBoss 6

使用 Runit/daemontools 或其他进程监控框架运行 JBoss 6

我正在尝试使用 runit 来守护 JBoss。

我使用/opt/jboss-6.1.0.Final/bin/run.sh脚本启动服务器。当我从命令行执行此操作时,JBoss 不会分离(这正是我们想要的),并且还会在按下 CTRL+C 时关闭。理论上,这是使用 runit 的完美候选者。

一切正常,除了我尝试让 runit 关闭 JBoss 时。当我发出命令时sv stop jboss什么也没发生。Runit 认为进程已停止,但 jboss 仍在正常运行。

我没有对run脚本做任何特殊处理。这是我的 runitrun脚本:

#!/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"}

有什么想法我可以尝试吗?

答案1

对于任何处于类似困境的人,我都弄清楚了问题所在。我正在解释我如何得到答案,因为我认为这可以帮助解决其他问题。

使用 runit 启动 JBoss 后,执行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认为jboss的pid是1857,但是检查输出ps,jboss的实际pid是1926,启动jboss的shell的pid是1857。这就是问题所在,运行脚本正在做一些有趣的事情。

如果你深入研究运行脚本,在经历了可怕的 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 将能够正确控制该进程。

答案2

当我用 exec 命令替换 eval 时,尽管 java 目录正确并且 eval 运行良好,但我还是收到以下异常。问题是当我使用 eval 时,jboss 启动时有 2 个进程正在运行。请提供建议。./standalone.sh: 289: exec: "/app/dms/java/jdk1.7.0_60/bin/java": 未找到

相关内容