我希望优雅地退出目标进程,而不是直接终止它。进程 A 向进程 B 发送命令,B 收到命令后,完成清理任务然后退出。
- 目标进程不是控制台程序,所以我无法使用
windows.GenerateConsoleCtrlEvent
。 - 目标进程不是 GUI,所以我无法使用
WM_CLOSE
。
Kill
Golang包中的方法实际上os
使用的是TerminateProcess
,这不是我想要的。
更新:
- 我尝试让目标进程监听 stdin。子进程启动后立即结束。这似乎在非交互模式下不起作用。
if runtime.GOOS == "windows" { reader := bufio.NewReader(os.Stdin) if _, err := reader.ReadString('\n'); err != nil { stop() } }
- 我尝试使用
taskkill /t
,但它告诉我目标进程是另一个进程的子进程。所以我调整了父子关系并让父进程调用taskkill /t
,但它仍然返回错误Exit status 128
。这很奇怪。
最后:
最后我使用命名管道解决了这个问题。缺点是它需要目标进程的代码支持。但这对我来说已经足够了,因为目标进程不是第三方进程。
如果不确定,我建议查看具有您想要的功能的知名开源应用程序。例如,Air 是一个众所周知的进程生成器,它监视文件更改并在更改时重新启动应用程序。它们实现启动和终止过程如下:
你可以在这里找到 repo
他们还引用了另一个 stack overflow 帖子来解释他们为什么使用这种特定方法。
最后我使用命名管道解决了这个问题。