如何在没有嵌套作业对象的情况下可靠地控制子进程生存期
How do you reliably control sub process lifetime without having nested 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
由于某种原因终止,它们会关闭其下的所有进程。不幸的是,我不能在这里使用作业对象,因为作业对象不嵌套。
实际上,我经常设法通过杀死上述树中的任意进程来创建"悬空"进程。我尽量避免留下任何过时的进程,但到目前为止,我提出的所有解决方案都依赖于某种监视其他进程的看门狗进程 - 但如果看门狗本身被杀死,所有的希望都会消失。
我认为存在误解,Windows 8将支持的新功能嵌套作业是什么。
如果使用启动进程server.exe
哪个启动进程launcherA.exe
哪个启动进程subProcessA.exe
等等,您只需在作业中启动server.exe
即可。以同样的方式,所有其他孩子(launcherA.exe
,subProcessA.exe
等)将自动在与他的父母相同的工作中启动。因此,您可以一次监视进程的所有集合。例如,您甚至可以在新进程的每次启动时收到通知,以创建详细的日志文件。我在某些应用程序上这样做了,效果非常好。
你能收到的唯一问题是,如果一些来自孩子exe的人也"足够现代",并使用乔布斯来控制他的孩子。只有在您必须使用新的嵌套作业的情况下。
如果我理解纠正你的问题,你目前的问题可以通过只把server.exe
放在新工作中来简单解决。
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 如何在没有系统/库的情况下控制GPIO
- 如何在没有网络的情况下控制NodeMCU,但使用像Qt这样的GUI(通过wifi)?
- 我们可以在不使用任何控制结构的情况下从函数中返回基于决策的值
- 如何在不移动C 中的光标坐标的情况下输出文本以控制特定坐标
- 是否可以在不向其写入文本的情况下在控制台中为给定的行着色
- 如何在没有嵌套作业对象的情况下可靠地控制子进程生存期