Commons Daemon / JSVC ライブラリを使用して Java プログラムをデーモン化し、サービスの 1 つのインスタンスを正常に開始/停止できました。私が本当に必要としているのは、サービスの複数のインスタンスを起動し、それぞれを異なるコマンド引数で開始および停止できるようにすることです。
おそらくこの問題とは関係ありませんが、少し背景があります。私のサービスには、特定のポートにバインドされた HTTP リスナーが組み込まれています。各インスタンスは、異なるポートをリッスンするように初期化されます。
私の問題は、Commons Daemon が提供する組み込み機能を使用して、Java クラスの複数のインスタンスを起動できないことです。多分私は何かが足りない。私は長年の Windows/C# 開発者ですが、Java/Linux/シェル スクリプトは比較的新しいものです。
JSVC プロセスを起動し、デーモンを開始/停止するためのシェル スクリプトを以下に示します。これは、このサイトの別の投稿で見つけたもので、いくつかのマイナーな変更が加えられています。デーモンが必要とするいくつかのコマンド引数を渡し、これらのパラメーターを指定する別の開始スクリプトと停止スクリプトからこの sh スクリプトを呼び出します。
#!/bin/sh
# Setup variables
EXEC=/usr/bin/jsvc
JAVA_HOME=/usr/lib/jvm/java-7-oracle
CLASS_PATH="/usr/share/java/commons-daemon-z.0.15.jar":"/opt/LuckyElephant/lib/LuckyElephant.jar"
CLASS=co.rightside.luckyelephant.Main
USER=ubuntu
PID=/tmp/luckyelephant.pid
LOG_OUT=/tmp/luckyelephant.out
LOG_ERR=/tmp/luckyelephant.err
ARGS="$*"
do_exec()
{
$EXEC -home "$JAVA_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS $ARGS
}
case "$1" in
start)
do_exec
;;
stop)
do_exec "-stop"
;;
restart)
if [ -f "$PID" ]; then
do_exec "-stop"
do_exec
else
echo "service not running, will do nothing"
exit 1
fi
;;
*)
echo "usage: luckyelephant {start|stop|restart}" >&2
exit 3
;;
esac
JSVC で一意の Java クラスの複数のインスタンスを起動できない場合、代替手段は何ですか? このサービスの複数のインスタンスを起動するための安全で安定した方法が必要です (SSH を使用してリモートおよびプログラムで実行します)。各インスタンスは、TCP ポートにバインドされているため、完了すると正常にシャットダウンする必要があります。