Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 7 在Windows7中,如何将Ctrl-C或Ctrl-Break发送到单独的进程_Windows 7_Signals_Control C - Fatal编程技术网

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

Windows 7 在Windows7中,如何将Ctrl-C或Ctrl-Break发送到单独的进程,windows-7,signals,control-c,Windows 7,Signals,Control C,我们的团队拥有每天运行的长期流程。这些过程通常在任何一天的晚上9点开始,一直运行到第二天的晚上7点。因此,它们通常每天运行22小时。它们由服务器上特定通用用户ID下的计划任务启动,并且无论该用户ID是否登录,它们都会启动并运行。因此,它们是无窗口控制台可执行文件 这些任务协调在大型服务器场上运行的计算。通常,这些控制任务在22小时/天内不间断运行。但是,我们通常需要停止并重新启动这些进程。因为它们控制着服务器场上运行的大量任务,所以必须干净地关闭它们,以便它们能够停止和关闭所有服务器场进程。这就

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

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


感谢您的帮助。

[将@Anon的评论升级为可查看的答案]

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


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

在您发送的链接中,关键行是“只有组中与呼叫进程共享同一控制台的进程才能接收信号”。这意味着generateConsoleControlEvent是无用的,并不能解决我上面的问题。恭喜你,现在你明白为什么采用这种方法是毫无意义的了。要想找到合适的解决方案,请使用命名事件或管道向流程发送信号。我知道GenerateConsoleLevent是无用的。我所看到的情况告诉我,似乎根本没有办法用CTRL\u BREAK\u事件向进程发出信号,而您似乎正在确认这一点。但我仍然感到震惊——微软真的愚蠢到不提供这个功能,还是我遗漏了什么?我不确定使用管道是否有用,因为我们永远不知道是否需要向流程发送信号(我们通常不知道),但也许我不理解你的建议。命名事件的建议听起来可能很有趣,谢谢。如果您想尝试替代
SendSignal.exe
,您可以尝试,但我不知道它是否对您更有效。您的问题可能是,想要杀戮的用户与运行长时间运行的进程的用户不同。。。