4

taskmanager または taskkill コンソール コマンドによって、誰かが私のアプリケーション (Java ですが、重要ではありません) を強制終了したときに、どうすればキャッチできますか?

私は自分のアプリケーションでこれをキャッチできないことを理解していますが、OS(もちろんWindows)のフックでこれを行うことができるかもしれません。easyhook ライブラリ ( http://www.codeplex.com/easyhook ) が役立つかもしれませんが、そこに例が見つかりません。私たちのアプリケーションは顧客のサーバーで頻繁に停止します。私は、誰が (または何が) アプリケーションを停止したかを知りたいだけです。アプリケーションの問題ではないことは確かです。タスク マネージャーから java.exe プロセスが強制終了されたようです。

4

4 に答える 4

2

あなたはこれを行うことができます:

Runtime.getRuntime().addShutdownHook(new Thread() {
  public void run() {
    // run some code
  }
});

VM がネイティブ コードでクラッシュした場合、これは呼び出されません。VM が停止している場合も呼び出されません。シャットダウンする理由も教えてくれません。シャットダウン フック API の設計 を参照してください。これ以上の情報は得られないと思います。

これまで、私はしばしばJava Service Wrapperを使用してきました。これは、Java プロセスを開始および再起動し、それらからの出力をログに記録する別のプロセスです。これは、例外によってプロセスが予期せず強制終了された場合に役立ちます。

于 2010-01-11T08:23:32.203 に答える
1

2つのアプリを使えば、Javaアプリでも簡単にできます。これは、多くの純粋な Java 生産システムで行われている方法です。

  1. メイン アプリは、標準の場所に .lock ファイルを作成し、それを排他的にロックします。
  2. あなたの他のプログラム(おそらくそれをジャニターアプリと呼んでいます)は、その上でlock()呼び出しを行い、待機し続けます。

  3. ロック呼び出しが返されたら、メイン アプリが終了していることを確認できます。これで決定できます。

    「なぜアプリケーションが強制終了されるのか」という質問に関しては、技術的には見つけることができません(おそらく1つまたは2つのシナリオですが、すべてのシナリオではありません)、AFAIK.

于 2010-01-11T08:17:35.987 に答える
0

ローカル マシンで実行され、メイン アプリケーションを監視する 2 つ目のアプリケーションを使用できます。メインアプリケーションがダウンすると、何かを実行できます (再起動、イベントのログなど) c

于 2010-01-11T08:16:52.247 に答える
0

アプリケーションが Java のタスク マネージャーによっていつ強制終了されたかを把握する (標準的な) 方法はありません。

通常のアプローチは、メイン アプリケーションを子プロセスとして開始する 2 つ目のアプリケーションを用意することです ( を使用ProcessBuilder)。ラッパーは、子供が死亡したときに通知します。通常の終了理由でSystem.exit()は、メイン アプリで終了コードを設定します。ラッパーで、終了コードを確認します。明示的に設定したものでない場合は、誰かがアプリを強制終了したか、VM のバグが原因でアプリがクラッシュしました。

これら 2 つを区別するには、子アプリの出力を確認し、現在のディレクトリ (アプリの場合は何でも、通常はアプリがインストールされたディレクトリ) で VM クラッシュ ダンプを探します。

于 2010-01-11T08:26:08.280 に答える