CLI(コマンドラインインターフェイス)Javaアプリケーションで+ (通常はプロセスを強制終了します)をインターセプト するにはどうすればよいですか?CtrlC
マルチプラットフォームソリューション(Linux、Solaris、Windows)は存在しますか?
私はConsole
'sを使用してreadLine()
いますが、必要に応じて、他の方法を使用して標準入力から文字を読み取ることができます。
CLI(コマンドラインインターフェイス)Javaアプリケーションで+ (通常はプロセスを強制終了します)をインターセプト するにはどうすればよいですか?CtrlC
マルチプラットフォームソリューション(Linux、Solaris、Windows)は存在しますか?
私はConsole
'sを使用してreadLine()
いますが、必要に応じて、他の方法を使用して標準入力から文字を読み取ることができます。
回答:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
これはシグナルを傍受できるはずですが、JVMが完全にシャットダウンする前の中間ステップとしてのみであるため、あなたが探しているものではない可能性があります。
+によってトリガーされる信号をインターセプトするにはSignalHandler
(sun.misc.SignalHandler
)を使用する必要があります(UnixおよびWindowsの場合)。
参照この記事(PDFファイル、ページ8および9を)。SIGINT
CtrlC
正常にシャットダウンし、シャットダウンプロセスを短絡させたくないと想定しています。私の仮定が正しければ、シャットダウンフックを見る必要があります。
何らかの理由でシャットダウンせずにCtrl+を処理できるようにCするには、何らかの形式の信号処理を使用する必要があります(Ctrl+C入力は実際にはアプリケーションに直接渡されるのではなく、生成するOSによって処理されるため)次にJavaに渡されるSIGINT。
見る 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では、ある程度はPOSIXと互換性があると聞いたのを覚えていますが、バージョンによって大きく異なる可能性があります。