web-dev-qa-db-ja.com

Runit / daemontoolsまたはその他のプロセス監視フレームワークを使用したJBoss6の実行

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
Alex Recarey

同様の束縛にある人のために、私は問題が何であるかを理解しました。他の問題の解決に役立つと思うので、どうやって答えにたどり着いたのかを説明しています。

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を実行し、svが報告するpidに注意してください。

# sv status jboss
run: jboss: (pid 1857) 17s; run: log: (pid 1856) 17s

svはjbossのpidが1857であると考えていますが、psからの出力を確認すると、jbossの実際のpidは1926、jbossを開始したシェルはpidは1857です。これが問題です。 run.shスクリプトは何か面白いことをしています。

run.shスクリプトを掘り下げて、恐ろしい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=$?

Jvmの実行には、evalの代わりにexecを使用しています。そのため、別のプロセスが生成され、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はプロセスを正しく制御できるようになります。

1
Alex Recarey

Evalをexecコマンドに置き換えると、Java dirは正しく、evalは正常に機能していますが、例外が発生します。問題は、jbossの起動時にeval2プロセスが実行されている場合に発生します。 。アドバイスをお願いします。/standalone.sh:289:exec: "/app/dms/Java/jdk1.7.0_60/bin/Java":見つかりません

0
Guest