我可以通过IsProcessInJob检查我的进程是否在一个作业中。但我需要处理这项工作。我该怎么做?
我们有一个自动化系统,用于包装作业对象中的进程。但是,我们必须调用提供给我们的脚本,该脚本在此作业对象之外启动进程。所以我们需要手动添加该过程,这样如果作业失败并且必须被杀死,它也会被杀死。
答案 0 :(得分:1)
Windows不提供打开与您的流程关联的作业对象的受支持方法;如果希望他们能够这样做,那么创建作业对象的过程的责任是为其他进程提供找到它的方法。但是,由于您想让孩子完成工作的唯一原因是它可能被自动化系统杀死,因此有另一种解决方案。
不要试图将子项放入现有的作业对象,而是创建一个 new 作业对象,一个由您自己控制,并将子项分配给它。设置JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
基本限制标志,以便在删除作业对象时杀死子项(以及它可能具有的任何子项),并确保您的作业对象句柄不可继承。
如果自动化系统终止您的进程,或者由于任何其他原因退出,Windows将自动关闭句柄并删除作业对象,并根据需要终止子进程。
答案 1 :(得分:0)
Harry Johnstons的建议奏效了。
如果将孩子投入工作的唯一原因是它可以被杀死,你可能能够以另一种方式做到这一点。将子项放入新创建的作业对象中,并设置JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE,并确保作业句柄不可继承。如果您的进程被终止,则作业句柄将被关闭,导致该子进程被杀死。