どうすれば“傍受” CLIアプリケーションでCtrl + C?
-
06-07-2019 - |
質問
どうすればインターセプト Ctrl + C (通常はプロセスを強制終了します) CLI(コマンドラインインターフェイス)Javaアプリケーションの場合
マルチプラットフォームソリューションは存在しますか(Linux、Solaris、Windows)
Console
の readLine()
を使用していますが、必要に応じて他の方法を使用できます
標準入力から文字を読み取る。
解決
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
これは信号をインターセプトできるはずですが、JVMが完全にシャットダウンする前の中間ステップとしてのみ、必要なものではない可能性があります。
トリガーされる SIGINT
シグナルをインターセプトするには、 SignalHandler
( sun.misc.SignalHandler
)を使用する必要があります Ctrl + C で(UnixおよびWindowsで)。
この記事(pdf、8ページおよび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でもわからないのですが、POSIXとある程度互換性があると聞いたのを覚えていますが、異なるバージョンではさまざまな機能があります。