Windows下如何实现类似SIGTERM的进程优雅终止?
需求:优雅退出目标进程
我希望优雅地退出目标进程而非直接终止——进程A向进程B发送指令,B接收后完成清理任务再退出。
限制条件
- 目标进程不是控制台程序,无法使用
windows.GenerateConsoleCtrlEvent - 目标进程不是GUI程序,无法使用
WM_CLOSE - Golang的
os包中的Kill方法实际调用的是TerminateProcess,不符合需求
尝试的方案及结果
1. 监听stdin方案
最初尝试让目标进程监听stdin,曾误以为非交互模式下无法工作(子进程启动后立即结束),后发现是自身对stdin的使用有误,该方案实际可行。
对应的Golang实现代码:
reader := bufio.NewReader(os.Stdin) if _, err := reader.ReadString('\n'); err != nil { stop() }
2. 使用taskkill /t方案
尝试执行taskkill /t命令,先收到“目标进程是其他进程的子进程”的提示;调整进程父子关系后让父进程调用该命令,仍返回错误Exit status 128,问题未解决。
最终解决方案
通过命名管道实现进程间的指令传递,完成目标进程的优雅退出。该方案的缺点是需要目标进程的代码支持,不过由于目标进程并非第三方程序,此方案可满足需求。
内容的提问来源于stack exchange,提问作者Colder
相关产品推荐
相关产品推荐

