在 Windows 7 中,如何将 Ctrl-C 或 Ctrl-Break 发送到单独的进程

问题描述 投票:0回答:1

我们的团队有每天运行的长期流程。这些流程通常在任意一天的晚上 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). 

所有其他“kill”函数都会立即终止进程,而不是发送信号。

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

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

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

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

任何帮助表示赞赏。

windows-7 signals control-c
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.