3

我们小组有每天运行的长期运行流程。这些流程通常在任何一天晚上 9 点开始,一直运行到第二天晚上 7 点。因此,它们通常每天运行 22 小时。它们由特定通用用户 ID 下的服务器上的计划任务启动,并且无论该用户 ID 是否登录,它们都会启动和运行。因此,它们是无窗口控制台可执行文件。

这些任务协调在大型服务器场上运行的计算。通常,这些控制任务每天 22 小时不间断地运行。但是,我们经常需要停止和重新启动这些进程。因为它们控制着在我们的服务器场上运行的大量任务,所以干净地关闭它们很重要,这样它们就可以停止和关闭所有服务器场进程。这让我想到了我们的问题。

控制过程已被编程为响应 ctrl-C 和 ctrl-break 信号。当进程在控制台中手动启动时,这可以正常工作,我们可以访问控制台并可以在控制台窗口中“键入”ctrl-c 或 ctrl-break。但是,如前所述,这些进程通常作为无窗口计划任务运行。因此,我们不能在不存在的控制台窗口中“键入”任何内容。因为它们是在没有登录进程的情况下执行的控制台进程,所以它们还必须能够在完全无窗口的环境中执行。那么,我们如何设置进程来监听关闭信号呢?

虽然该进程确实在侦听 ctrl-C 和 ctrl-break 信号,但我看不出有办法将该信号发送给进程。这似乎是 Windows 中的一个基本问题,还是我错了?我知道 SendSignal.exe,但到目前为止一直无法让它工作。它失败如下:

>SendSignal 26320
Sending signal to process 26320...
CreateRemoteThread failed with 0x00000005.
StartRemoteThread failed with 0x00000005.
0x00000005 == Access is denied.

在没有 -F 的情况下尝试“taskkill”会导致:

>taskkill /PID 24840
ERROR: The process with PID 24840 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option). 

所有其他“终止”功能会立即终止进程,而不是发送信号。

一种可能的解决方案是基于文件监视的解决方案:为特定文件的某些修改创建监视。但这是一个 hack,我们更愿意用适当的信号来做。有没有人解决过这个问题?它似乎是一个非常基本的功能,在 Unix 环境中实现它肯定是微不足道的。微软肯定提供了一些机制来允许干净关闭无窗口的可执行文件吗?

我知道下面的线程,其问题实际上是相同的(除了说明为什么需要答案,即为什么需要能够为无窗口、无控制台进程执行此操作),但没有答案“使用SendSignal”有例外,正如我所说,它对我们不起作用:

我可以向 Windows 上的应用程序发送 ctrl-C (SIGINT) 吗?

还有其他类似的问题,但目前还没有答案。

任何帮助表示赞赏。

4

1 回答 1

-1

[将@Anon 的评论升级为可见性答案]

windows-kill完美运行并设法解决了 SendSignal 面临的访问拒绝问题。当然,特权用户也必须运行它。

windows-kill还支持 ctrl-c 和 ctrl-break 信号。

于 2018-12-27T18:42:54.320 回答