我们的小组每天都有长时间运行的流程。这些过程通常在任何一天的晚上9点开始,并持续到第二天的晚上7点。因此,它们通常每天运行22小时。它们由特定通用用户标识下的服务器上的计划任务启动,无论该用户标识是否已登录,它们都会启动和运行。因此,它们是无窗口的控制台可执行文件。
任务协调在大型服务器场上运行的计算。通常,这些控制任务在整个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”没有任何答案,正如我所说,这对我们不起作用:
Can I send a ctrl-C (SIGINT) to an application on Windows?
还有其他类似的问题,但目前还没有答案。
任何帮助表示感谢。
答案 0 :(得分:0)
[将@Anon的评论升级为可见性的答案]
windows-kill工作得很好,并设法解决了SendSignal面临的访问拒绝问题。特权用户当然也必须运行它。
windows-kill
还支持ctrl-c和ctrl-break信号。