どうすればintercept Ctrl+C (通常はプロセスを強制終了します)CLI(コマンドラインインターフェイス)でJava application?
マルチプラットフォームソリューションは存在しますか(Linux、Solaris、Windows)?
Console
のreadLine()
を使用していますが、必要に応じて、他の方法を使用して標準入力から文字を読み取ることができます。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
これは信号をインターセプトできる必要がありますが、JVMが完全にシャットダウンする前の中間ステップとしてのみ、必要なものではない場合があります。
SignalHandler
(Sun.misc.SignalHandler
)によってトリガーされるSIGINT
信号をインターセプトする Ctrl+C (UnixおよびWindows上)。
を参照してください この記事 (pdf、page 8 and 9)。
私はあなたが正常にシャットダウンし、シャットダウンプロセスを短絡させたくないと仮定しています。私の仮定が正しい場合は、 シャットダウンフック を確認する必要があります。
処理できるようにするために Ctrl+C 何らかの理由でシャットダウンせずに、何らかの形式の信号処理を使用する必要があります( Ctrl+C 入力は実際にはアプリケーションに直接渡されませんが、代わりにJavaに渡されるSIGINTを生成するOSによって処理されます。
信号処理の詳細については、 http://www.Oracle.com/technetwork/Java/javase/signals-139944.html を参照してください。
(正常にシャットダウンしたい場合は、akfの答えで十分です。)
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では動作するはずです.