【问题标题】:In Windows 7, how to send a Ctrl-C or Ctrl-Break to a separate process在 Windows 7 中,如何将 Ctrl-C 或 Ctrl-Break 发送到单独的进程
【发布时间】:2014-08-05 15:16:23
【问题描述】:

我们的小组有长期运行的流程,每天都在运行。这些流程通常在任何一天晚上 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”,正如我所说,这对我们不起作用:

Can I send a ctrl-C (SIGINT) to an application on Windows?

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

任何帮助表示赞赏。

【问题讨论】:

  • 在您发送的链接中,关键行是“只有与调用进程共享同一控制台的组中的那些进程才能接收信号”。言下之意就是 GenerateConsoleCtrlEvent 没用,也不能解决我上面的问题。
  • 恭喜,现在您明白为什么追求这种方法毫无意义了。清除您的想法以找到正确的解决方案,使用命名事件或管道来指示过程。
  • 我知道 GenerateConsoleCtrlEvent 没用。我所看到的告诉我,似乎根本没有办法用 CTRL_BREAK_EVENT 发出进程信号,而您似乎正在确认这一点。但是我仍然感到震惊-MS真的很愚蠢以至于不提供此功能,还是我遗漏了什么?我不确定使用管道是否有用,因为我们永远不知道我们是否可能需要向该过程发出信号(我们通常不需要),但也许我不理解您的建议。命名事件的建议听起来可能很有趣,谢谢。
  • 如果您想尝试替代SendSignal.exe,您可以尝试windows-kill,但我不知道它是否更适合您。您的问题可能是想要杀死的用户与运行您长时间运行的进程的用户不同......

标签: windows-7 signals control-c


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多