2012-01-03 13 views
1

私はUNIX上で永遠に実行されるべきプロジェクトを持っています。しかし、私たちはそれを停止する必要がある場合、私はそれを正常に閉じる終了プログラムを書くことを考えています。 私はこの種のプログラムを書いた経験がありません。 誰でも私にいくつかのヒントを教えてください。 Javaでシグナルを捕捉するシグナルはありますか? ありがとうjava終了プログラムについて

+1

[bashスクリプトを使用して初期化されたJavaアプリケーションでSIGNALをトラップする方法](http://stackoverflow.com/questions/4147288/how-to-trap-a-signal-in-a-java -application-initialized-a-bash-scriptを使用) – hvgotcodes

答えて

1

ここにはいくつかのオプションがあります。

1つは、コマンドライン入力を受け入れることができるということですが、それはあなたが端末などを閉じると起こらないかもしれない入力ストリームにアクセスする必要があります。おそらくこれを行うための最良の方法は、ソケットのいずれかで、シャットダウンするために特定のストリームをリスンするようにします。あなたの終了プログラムは、そのソケットへの書き込みを担当します。

もう1つの選択肢は、共有メモリのようなもっと複雑なIPCを使用することです。

最後に、システム上のどこかに格納されたフラットファイルを使用して、プロセスが変更を監視することもできます。終了プログラムは、そのファイルに書き込みます。

+0

ありがとう!私はソケットを使用することは良いアイデアだと思います! –

2

アプリケーションにシャットダウンフックを追加する必要があります。これは、プログラムが正常に終了したとき、またはユーザー割り込み、SIGTERMシグナル、またはユーザー・ログオフやシステム・シャットダウンなどのシステム全体のイベントに応答してJVMが終了したときに開始されるスレッドです。詳細についてはjavadocsをご覧ください。

1)シャットダウンフッククラスを作成します:

public class AppShutdownHook extends Thread{ 
    public void run(){ 
     logger.info("Running shutdown hook...") ; 
     //cleanup e.g. close database connections etc 
    } 
} 

2)をシャットダウンフックの登録:

public class App{ 
    public App(){ 
     Runtime.getRuntime().addShutdownHook(new AppShutdownHook()) ; 
    } 
} 

の美しさをここで

はシャットダウンフックを作成する際に必要な手順ですこの方法では、アプリケーションを停止するかマシンを再起動するたびに実行する必要がある特別な「停止スクリプト」がないことです。

参考:Shutting Down Java Apps

0

私は時間前に頼まれてsimilar questionを思い出しました。可能な方法の1つは、SignalHandlerの使用です。

full article hereを読むことができます。これはIBM JVMに関連しているようですが、Java Hotspotでも同様に有効です。

のJavaのあまり知られていない機能が sun.misc.Signal クラスを介してサポートされてい 独自のシグナルハンドラをインストールするアプリケーションの 能力です。ただし、 クラスをsun.miscパッケージ から使用する場合は、文書化されていない サポートクラスが含まれており、Javaのリリース間で が変更される可能性があるため、注意が必要です。 のシグナル用にJavaハンドラをインストールすることができますが、これはJVMでは使用されません。これらの 信号ハンドラはネイティブの ハンドラに似ていますが、それは ネイティブシステム信号が発生したときに呼び出されるためですが、 は常に別の Javaスレッドとして実行されます。基本的に、 シグナルが発生し、Java シグナルハンドラが利用可能な場合、JVMの 「シグナルディスパッチャスレッド」が起動され、 が通知され、シグナルが通知されます。シグナル ディスパッチャスレッドは、Java メソッドを呼び出して、インストールされたJavaシグナル ハンドラの新しい スレッドを作成して開始します。 Javaシグナル ハンドラを記述するには、 がsun.misc.SignalHandler インタフェースを実装するクラスを定義し、ハンドラを で登録します。これは、sun.misc.Signal.handle() メソッドを使用して行います。

は、私はまた、テーマについての議論に参加したhere

+0

oops ...私が鉱山を投稿したときに答えが見えなかった...私はibmとsun jdk6の両方のインストールをチェックしたが、どちらもまだこの機能をサポートしているようだ。 –

0

Javaで扱う信号を行うことは可能であるが、それはsun.miscを使用してに依存している機能です。*クラスになるために何かしています彼らは内部クラスとなっており、リリース間の主題の変更とみなされるので注意してください。その注意点が

、詳細については、このリンクをチェック:http://www.ibm.com/developerworks/ibm/library/i-signalhandling/#N102C8

をこの記事では、Java 1.3.1に基づいていますが、メカニズムはまだ日とIBM 1.6 JVMの両方に存在しています。

あなたのjvmにネイティブシグナルハンドラをインストールするためにjniとagentlibを使用することが可能かどうかは疑問です...私は決してそれを試したことはありませんでした。 jvmにはすでにオーバーライドできない信号処理がある可能性があります。

関連する問題