3

デーモンとして起動される Java アプリケーションを作成しました (bash を介して stderr と stdout をリダイレクトし、stdin を閉じることをデーモン化します)。ただし、このアプリケーションにメッセージを送信して、動作の特定の部分を変更するように通知したい場合があります。端末からアプリケーションにメッセージを送信できるようにする必要があるため、グラフィカル ユーティリティを必要とするものは何でも構いません。

動作の変更は非常に簡単です。アプリケーション内の 1 つのスレッドの状態を切り替えるトグルと、アプリケーションを適切に閉じる方法が必要です。

これを達成するためのオプションは何ですか?ある種のソケットでメッセージをリッスンするスレッドをプロセスに含めることができることは知っていますが、これは私が持っているニーズに対してやり過ぎのようです。

私は Linux/Unix のシグナルにあまり詳しくないので、いくつかのシグナルに対してカスタム ハンドラーをセットアップし、プロセスがシグナルを受信したときにコードを実行できるかどうかを尋ねたいと思います。

私が単に知らない、または考えたことのない他のオプションはありますか?

4

3 に答える 3

3

信号が最も簡単かもしれません。アプリケーションで使用できる SIGUSR1 と SIGUSR2 があり、それらのハンドラーを記述してトグルを管理できます。通常、ハンドラーで多くのことをしたくないので、スイッチを設定すると、メインループ (またはその他のもの) がスイッチをチェックしてそれに応じて動作する必要があります。同様に、変更した構成ファイルを読み取るようにシグナルの受信をプログラムすることもできます。

それを超えて、利用可能な任意の IPC (fifos、ソケット、MQ) を使用できますが、スレッドをブロックするか、何らかの方法でselectステートメント (またはそれに相当する Java のもの) を組み込むことになります。

于 2012-07-21T04:58:29.067 に答える
1

基本的に、アプリケーション(サーバー)と通信する小さなクライアントが必要です。したがって、デフォルトの解決策は、何らかのIPCメカニズムを使用することです。IPCメカニズムを導入することは、1回限りの作業であり、要件に合わせて拡張できるため、問題を起こす価値があります。IPCに信号を使用することはお勧めしません。ソケットは良い方法だと思います。

于 2012-07-22T02:24:34.480 に答える
1

個人的には、これには OS シグナルを使用するのが好きです。

java.lang.Runtime.addShutdownHookを使用して、SIGTERM、SIGINT、または SIGHUP を送信します。

一部のシグナルは内部使用のために予約されていることに注意してください。使用している JVM のドキュメントを確認してください。

SignalHandlerは、サポートされているパブリック インターフェイスの一部ではないため、マイレージは異なる場合があります。

C コードから JVM をインスタンス化する場合は、JVM の前に (C で) シグナル ハンドラーを設定するだけで問題ありません。

于 2012-07-21T04:53:50.420 に答える