1

Javaでサービス/デーモンを作成するための小さなライブラリを作成しました。アイデアは単純です。アプリケーションを起動するときに、コマンドとポート番号を渡します。コマンドが開始コマンドの場合、アプリケーションの新しいインスタンスが指定されたポートで開始されます。それ以外の場合、コマンドはそのポートで実行されている可能性のあるすべてのインスタンスに送信されます。

つまり、ライブラリはデーモンコントローラスレッドを開始するdaemonizeメソッドを提供します。ソケットを使用して、アプリケーションをそれ自体のインスタンスと通信させます(おそらくすでに理解しているように)。

わかりやすくするために、次の使用方法の例を示します。

public class MyApp extends Daemon
{
    public static void main(String[] args)
    {
        if (daemonize(MyApp.class, args))
        {
            // normal main body
            startMyServerOrWhatever();
        }
        else
        {
            // failed to start or send command to daemon
            // probably wrong syntax or unknown command
            printUsageInfoAndExit();
        }
    }

    @Command(start = true)
    public static int start()
    {
        // executed on "start" command, e.g. java -jar MyApp.jar start 8899
        doSomeInitializing();
        return 0; // return 0 or void to detach from console
    }

    @Command
    public static void mycmd()
    {
        // executed on "mycmd" command, i.e. java -jar MyApp.jar mycmd 8899
        doSomethingCool();
    }

    @Command(stop = true)
    public static int stop()
    {
        // executed on "stop" command, i.e. java -jar MyApp.jar stop 8899
        doSomeCleanup();
        return 0; // used as application exit code
    }
}

ライブラリは非常にうまく機能し、Linuxサーバーで実行されるデーモンをいくつか作成するために使用しました。現在欠落しているのは、管理者がサーバー上の他のデーモンを制御するようにこれらのデーモンを制御できるようにするためのスクリプトです(たとえば、起動時に開始します)。

残念ながら、私の* nixスキルは、特にスクリプトに関しては、トップレベルではありません。私はBSDスタイルのinitプロシージャ(rc.d)の基本を理解していますが、このようなサンプルスクリプトを見ると、少し迷っています。

だから私の質問は、私の場合、これを行うためのより簡単な方法はありませんか?つまり、私のデーモンはすでにコマンドを理解しており、すべてのアクションを自分で担当する必要があります(デーモンが停止に応答しない場合を除き、タイムアウト後に強制終了する必要があります)。

4

2 に答える 2

1

たぬきソフトウェアによるJavaサービスラッパーを実際に見てください。http://wrapper.tanukisoftware.com/
を参照してください。

彼らのアプローチで私が気に入っているのは、単一のツールと共通のスクリプトでデーモンと Windows サービス プロセスを標準化していることです。

nexus、servicemix などの有名なプロジェクトで、このツールがかなりのレベルで採用されていることに気付きました。

また、デーモン プロセスの管理に Java Service Wrapper を採用しているプロジェクトに出くわすと、コマンド セットと構成はすでに慣れ親しんでいるため、学習曲線が低くなります。

おそらく、ソケット コントローラーのメカニズムをこの既存のフレームワークに適合させることができます。

于 2011-03-08T09:19:32.690 に答える
0

もっと簡単な方法はありませんか

SSH 経由で Java アプリケーションを起動するデーモン スクリプトを1 回作成しました。それらは最小限です - 強制終了や rc.d/SMF 統合はなく、TERM シグナルを使用したデーモンの起動とシャットダウンのみです。

于 2012-10-27T13:36:08.557 に答える