2012-08-01 9 views
16

私はシャットダウンフックを使用してプログラムの終了/中断を解決するJavaアプリケーションを開発中ですが、 CTRL-CのCygwinの実装はシャットダウンフックを起動しないようです。表面では、プロセスを中断したように見え、コマンドラインに制御を戻しますが、プロセスのシャットダウンフックはまったくトリガされないため、クリーンアップは発生しません。CygwinのCTRL-C(信号割り込み)が正常に動作していない - JVMのシャットダウンフックが起動していない

cmdではそれらは捕まえられますが、さまざまな制約のために私は何とかそれらをCygwinで動作させる必要があります。

実行中のプロセスでCygwinを使用してSIGINTを起動する方法はありますか?または、中断や終了時にクリーンアップするために使用できるシャットダウンフックの代替手段ですか?

+0

奇妙なことに、cygwinのPythonでSIGINTを問題なくキャプチャできます。他のアイデアについては、http://stackoverflow.com/questions/1028687/best-way-to-gracefully-shutdown-a-java-command-line-programを参照してください。 – AlG

+0

それは奇妙ですが、私の試みはプロセスをシャットダウンしますが、SIGINTがオフに設定されていると、Javaアプリケーションのシャットダウンフックが間違いなくキャッチしていません - プログラムは終了しますが、クリーンアップは実行されません。しかし、私はそのスレッドを見て、ありがとう、ありがとう。 – Quetzalcoatl

+0

問題の説明:http://cygwin.1069669.n5.nabble.com/CTRL-C-is-not-working-with-java-on-latest-cygwin-1-7-15-td63179.html –

答えて

0

This threadおそらくいくつかの光を放つ。 ( - > bashの - > javaのbashシェル)ハワード・チューによっていくつかのオプション

timeout 1d <command> 

または

Ctrl-C patch

12

bashは中間bashのプロセスを通じて非cygwinの(ウィンドウ)の実行ファイルを起動します。 Ctrl-Cとタイプすると、bashプロセスはSIGINTを取得し、子プロセスを強制終了し、シャットダウン・フックは呼び出されません。 Windowsプロセスは、SIGINT、SIGTERM、SIGKILLなどのシグナルを認識しません。

オプション文書に記載されているように、javaプロセスはCTRL_C_EVENTウィンドウイベントのコンソール制御ハンドラを登録し、シャットダウンフックを起動する正常な終了をトリガします。 Ctrl-Cを期待どおりに動作させるには、javaプロセスがそれを受け取るようにする必要がありますが、今はbashによって傍受され、子プロセスに渡されません。

この問題は次のように再記述することができます:CygwinがCtrl-CをWindowsコンソールプロセスに転送するにはどうすればよいですか?

注:上記のbashの動作は、バージョン1.7.25で検証されました。

+0

ボトムラインは、cygwinの問題ではなく、Javaの問題です。 – HDave

関連する問題