3

サービスとして実行されるアプリケーションを開発しています。ファイルのクリーンアップを行うために、プログラムにシャットダウン フックを追加しました。プログラムをサービスとして (Linux ではデーモンまたは Windows サービスとして) インストールすると、シャットダウン フックが正しく実行されます。ただし、IDE で実行している場合、シャットダウン フックは実行されません。IDE で実行中のプロセスを停止し、シャットダウン フックを実行する方法はありますか?

ありがとう、パブロ

4

3 に答える 3

4

残念ながら、現在の Netbeans システム内でこれを行う方法はありません。両方のタイプのアプリ テスト (デバッグと通常) の kill メソッドは両方ともプロセスを強制終了し、クリーンアップの機会を与えないためです。アプリのアーキテクチャによっては、System.exit(0) 呼び出しを追加できる場合がありますが、それ以外は、コンソールで開くのが面倒です。

于 2012-10-26T12:11:03.383 に答える
2

同意しません。UNIX の sigkill または Windows の終了プロセスは、定義上、実行中のプロセス強制終了しますが、アプリケーションはこれらのイベントをキャッチできません。これは、応答しないプロセスを終了するために必要です。これらのシグナルは、プロセスが siginit (ctrl c) または sigterm または Windows の終了タスクに応答しない場合にのみ使用してください。NetBeans は、siginit または sigterm ではなく、sigkill を送信しているようです。私に関する限り、これは悪い習慣です。

プロセスを強制終了するための 2 番目のオプションがあるはずですが、1 番目のプロセス終了ボタンは siginit または sigterm を送信する必要があります。アプリケーションは、ユーザーがアプリケーションでctrl cまたは終了タスクを押すことを予期し、最善の努力として、データをきれいに閉じfiles/socketsて保存する必要がありpersistent/stateます。アプリケーションは、sigkill または終了プロセスを予期するのではなく、sigkill または終了プロセスが必要ないように開発する必要があります。

NetBeans がこれらのメソッドを IDE からアプリケーションを終了する唯一の手段として使用するのは誤りです。

于 2013-03-28T05:18:42.963 に答える
0

いいえ。シャットダウン フックを使用してプログラムをクリーンアップしないでください。ドキュメントから...

まれに、仮想マシンが異常終了する場合があります。つまり、正常にシャットダウンせずに実行が停止する場合があります。これは、たとえば、Unix の SIGKILL シグナルまたは Microsoft Windows の TerminateProcess 呼び出しで、仮想マシンが外部で終了したときに発生します。たとえば、内部データ構造が破損したり、存在しないメモリにアクセスしようとしたりして、ネイティブ メソッドが失敗した場合にも、仮想マシンは中止される可能性があります。仮想マシンが異常終了した場合、シャットダウン フックが実行されるかどうかは保証されません。

シャットダウン フックが常に呼び出されるという保証がないと契約書に記載されている場合、それらを重要な操作に使用することはお勧めできません。

于 2012-10-26T12:18:29.287 に答える