1

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 ポートにバインドされているため、完了すると正常にシャットダウンする必要があります。

4

3 に答える 3

0

このデーモンの n 個のインスタンスをデプロイする必要があると仮定すると、たとえば 3 個 (jDaemon_A、jDaemon_B、および jDaemon_C) とします。次の 3 つのオプションのいずれかを使用して問題に取り組みます。

オプション A: 個別のデータ ディレクトリを使用して、サービスを 3 回デプロイします。そして、命名規則を使用して、それぞれを区別します。

jDaemon_A using directory /root/jdA;
jDaemon_B using directory /root/jdB;
jDaemon_C using directory /root/jdC;

個別に開始できるように

service jDaemon_A start
etc…

オプション B: 上記に加えて、引数を渡すことができるように、上記の上に好きなだけインスタンスを管理する別の Java クラスを実装します。

service jDaemon_Manager start all
service jDaemon_Manager start B

すべてまたは 1 つの特定のインスタンスのみを開始する機能を提供します。

オプション C: マルチスレッド。同じロジックが別々のスレッドで同時に実行されるように、現在のデーモンをマルチスレッド モードで 1 つのインスタンスだけで実行することを検討しましたか? この方法では、1 つのデーモンのみが実行されます。

スレッドは比較的独立して動作する可能性があるため、これは実行可能なソリューションになる可能性があります。

もちろん、これはあなたの場合には当てはまらないかもしれませんが、検討する価値のあるルートだと思いました.

于 2014-03-09T18:29:41.183 に答える
0

インスタンスごとに異なる pidfile を使用して、デーモンの複数のインスタンスを実行できました。また、追跡を容易にするための別の log_out および log_err ファイルもあります。

于 2015-03-05T07:01:41.547 に答える