在作业对象中启动批处理脚本,并在批处理终止时终止在作业内部创建的所有进程?

在作业对象中启动批处理脚本,并在批处理终止时终止在作业内部创建的所有进程?

我有一个批处理脚本,它在基于 Windows 的 Jenkins 节点上运行(意味着无头,不涉及 [GUI] 窗口)批处理脚本的标准输入已通过 禁用< NUL以避免出现“终止批处理作业(Y/N)”提示。

批处理脚本执行一些准备工作,最终调用在 Cygwin 或 MSYS2(取决于节点)中运行的 Bash 脚本。从那里创建了许多新进程,调用了其他 Bash 脚本,调用了其他批处理脚本等。

问题:有没有办法,从命令行——即cmd.exe——创建作业对象“聚集”初始批处理脚本创建的进程以及随后由这些脚本创建的进程......?

这里的目标是强制拆除作业中的所有进程 - 就像作业中的进程超出资源配额时所做的那样 - 一旦初始脚本终止(无论哪种方式!)。

或者:如果cmd.exe太有限,那么“标准” Windows 10/11 安装中还有哪些其他实用程序可以实现这一点?

PS:Microsoft/Sysinternals 的 Process Explorer 有一项名为“Kill Process Tree”的功能。这大概就是我需要的。唉,无论如何,“进程树”都不是一种可靠的机制。它依赖于子进程内部匹配的父进程 PID,而且根本无法保证父进程比子进程活得更久,而且语义也与 Unix 有很大不同。

答案1

从 CMD,您可以使用命令title重命名该窗口的标题。

例如,您可以按如下方式设置标题:title kill me later

您可能希望对生成的每个进程都执行此操作。您可以创建一个批处理文件,首先更改标题,然后根据需要启动另一个程序。

稍后在批处理脚本中,您现在可以用以下命令查询这些窗口:

tasklist /FI "WINDOWTITLE eq kill me later" 

如果你喜欢你所看到的内容,你可以使用以下命令终止它:

taskkill /FI "WINDOWTITLE eq kill me later" /F

这将关闭所有带有标题的窗口kill me later

开关/f将强制关闭窗口。省略此参数将尝试关闭它,但可能会提示您是否要关闭窗口。

请注意,cmd 无法通过这种方式自行关闭。它只是找不到窗口。

在此处输入图片描述

此外,如果您使用 Windows 终端,并且在其中生成一个 CMD 实例,则使用此方法不仅会关闭该 CMD 实例,而且还会关闭整个 Windows 终端实例。

答案2

一个简单的方法是创建一个专门用于该任务的用户帐户。

然后可以以 RunAs 此用户帐户启动初始批处理脚本,这意味着所有后续子任务也将在同一用户帐户下运行。

然后可以通过以下方式终止所有任务:

taskkill /f /fi "USERNAME eq user-account-name"

此命令可能需要以管理员权限运行。

相关内容