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
次の動作を実装しようとしています。
何らかの理由で終了した場合
server.exe
(クラッシュしたため、ユーザーがタスク マネージャーを使用して終了することを決定したため、または単に実行を終了したため)、その下にあるすべてのプロセスを停止します。これにはジョブ オブジェクトを使用します。launcherA.exe
または何らかの理由で終了した場合launchedB.exe
、それらはその下にあるすべてのプロセスを停止します。残念ながら、ジョブ オブジェクトはネストされないため、ここではジョブ オブジェクトを使用できません。
現状では、上記のツリーで任意のプロセスを強制終了することで、「ダングリング」プロセスを作成することがよくあります。古いプロセスを残さないようにしていますが、これまでに思いついた解決策はすべて、他のプロセスを監視するある種のウォッチドッグ プロセスに依存していますが、ウォッチドッグ自体が強制終了されると、すべての希望が失われます。