Job Objects 上的MSDN 页面解释说:
一个进程只能与一个作业相关联。作业不能嵌套。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
因某种原因终止,它们会删除它们下面的所有进程。不幸的是,我不能在这里使用作业对象,因为作业对象不嵌套。
事实上,我经常通过杀死上述树中的任意进程来创建“悬空”进程。我尽量避免留下任何陈旧的进程,但到目前为止我提出的所有解决方案都依赖于某种监视其他进程的看门狗进程——但如果看门狗本身被杀死,所有希望都将落空。