如何在没有嵌套作业对象的情况下可靠地控制子进程生存期

How do you reliably control sub process lifetime without having nested job objects?

本文关键字:情况下 控制 生存期 子进程 对象 作业 嵌套      更新时间:2023-10-16

作业对象上的 MSDN 页面解释:

一个

进程只能与一个作业关联。作业不能嵌套。嵌套作业的功能是在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.exelaunchedB.exe由于某种原因终止,它们会关闭其下的所有进程。不幸的是,我不能在这里使用作业对象,因为作业对象不嵌套。

实际上,我经常设法通过杀死上述树中的任意进程来创建"悬空"进程。我尽量避免留下任何过时的进程,但到目前为止,我提出的所有解决方案都依赖于某种监视其他进程的看门狗进程 - 但如果看门狗本身被杀死,所有的希望都会消失。

我认为存在误解,Windows 8将支持的新功能嵌套作业是什么。

如果使用启动进程server.exe哪个启动进程launcherA.exe哪个启动进程subProcessA.exe等等,您只需在作业中启动server.exe即可。以同样的方式,所有其他孩子(launcherA.exesubProcessA.exe等)将自动在与他的父母相同的工作中启动。因此,您可以一次监视进程的所有集合。例如,您甚至可以在新进程的每次启动时收到通知,以创建详细的日志文件。我在某些应用程序上这样做了,效果非常好。

你能收到的唯一问题是,如果一些来自孩子exe的人也"足够现代",并使用乔布斯来控制的孩子。只有在您必须使用新的嵌套作业的情况下。

如果我理解纠正你的问题,你目前的问题可以通过只把server.exe放在新工作中来简单解决。