web-dev-qa-db-ja.com

CLIアプリケーションでCtrl + Cを「インターセプト」するにはどうすればよいですか?

どうすればintercept Ctrl+C (通常はプロセスを強制終了します)CLI(コマンドラインインターフェイス)でJava application?

マルチプラットフォームソリューションは存在しますか(Linux、Solaris、Windows)?

ConsolereadLine()を使用していますが、必要に応じて、他の方法を使用して標準入力から文字を読み取ることができます。

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

これは信号をインターセプトできる必要がありますが、JVMが完全にシャットダウンする前の中間ステップとしてのみ、必要なものではない場合があります。

SignalHandlerSun.misc.SignalHandler)によってトリガーされるSIGINT信号をインターセプトする Ctrl+C (UnixおよびWindows上)。
を参照してください この記事 (pdf、page 8 and 9)。

117
VonC

私はあなたが正常にシャットダウンし、シャットダウンプロセスを短絡させたくないと仮定しています。私の仮定が正しい場合は、 シャットダウンフック を確認する必要があります。

16
akf

処理できるようにするために Ctrl+C 何らかの理由でシャットダウンせずに、何らかの形式の信号処理を使用する必要があります( Ctrl+C 入力は実際にはアプリケーションに直接渡されませんが、代わりにJavaに渡されるSIGINTを生成するOSによって処理されます。

信号処理の詳細については、 http://www.Oracle.com/technetwork/Java/javase/signals-139944.html を参照してください。

(正常にシャットダウンしたい場合は、akfの答えで十分です。)

8
Amber

SIGTERMの処理方法に関するリンク-プログラムがOS側で取得している信号です。

http://blog.webinf.info/2008/08/intercepting-sigterm.html

http://Java.Sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html

http://www.ibm.com/developerworks/Java/library/i-signalhandling/

それはPOSIXオペレーティングシステムで動作するはずです-つまり、MacとUnixはWindowsでは動作するはずです.

4
Henning