5

Job ObjectsのMSDN ページでは、次のように説明されています。

プロセスは、1 つのジョブにのみ関連付けることができます。ジョブはネストできません。ジョブをネストする機能は、Windows 8 Consumer Preview と Windows Server 8 Beta で追加されました。

残念ながら、これはまさに私が必要としているもののようです。私はこのようなプロセスツリーを扱っています:

server.exe
  |
  +--+ utility.exe
  |
  +--+ launcherA.exe
  |      |
  |      +--+ programA.exe
  |             |
  |             +--+ subProcessA.exe
  |
  +--+ launcherB.exe
         |
         +--+ programB.exe

次の動作を実装しようとしています。

  1. 何らかの理由で終了した場合server.exe(クラッシュしたため、ユーザーがタスク マネージャーを使用して終了することを決定したため、または単に実行を終了したため)、その下にあるすべてのプロセスを停止します。これにはジョブ オブジェクトを使用します。

  2. launcherA.exeまたは何らかの理由で終了した場合launchedB.exe、それらはその下にあるすべてのプロセスを停止します。残念ながら、ジョブ オブジェクトはネストされないため、ここではジョブ オブジェクトを使用できません。

現状では、上記のツリーで任意のプロセスを強制終了することで、「ダングリング」プロセスを作成することがよくあります。古いプロセスを残さないようにしていますが、これまでに思いついた解決策はすべて、他のプロセスを監視するある種のウォッチドッグ プロセスに依存していますが、ウォッチドッグ自体が強制終了されると、すべての希望が失われます。

4

1 に答える 1

0

Windows8でサポートされる新機能のネストされたジョブとは何かについて誤解があると思います。

server.exe開始プロセス、開始プロセス、launcherA.exe開始プロセスなどを使用する場合は、ジョブをsubProcessA.exe開始するだけです。server.exeこのようにして、他のすべての子(launcherA.exesubProcessA.exeなど)は、親と同じジョブ内で自動的に開始されます。したがって、プロセスのすべてのコレクションを一度に監視できます。たとえば、詳細なログファイルを作成するために、新しいプロセスが開始されるたびに通知を受け取ることもできます。私はいくつかのアプリケーションでこれを行いました、そしてそれは非常にうまくいきます。

受け取ることができる唯一の問題は、子exeからの一部も「十分に現代的」であり、ジョブを使用し子を制御するかどうかです。新しいネストされたジョブを使用する必要がある場合のみ。

私があなたの質問を正解することを理解した場合、あなたの現在の問題はserver.exe、新しい仕事に就くことによって簡単に解決することができます。

于 2012-04-26T15:32:45.953 に答える