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)の基本を理解していますが、このようなサンプルスクリプトを見ると、少し迷っています。
だから私の質問は、私の場合、これを行うためのより簡単な方法はありませんか?つまり、私のデーモンはすでにコマンドを理解しており、すべてのアクションを自分で担当する必要があります(デーモンが停止に応答しない場合を除き、タイムアウト後に強制終了する必要があります)。