go - SIGKILL 以外的信号不会在 Windows 上终止进程

标签 go signals

我正在通过 Go 启动一个简单的 Java 应用程序,目的是证明 Go 可以发送像 SIGQUIT 或 SIGTERM 这样的信号,并且 Java 可以捕获并适本地处理它(即正常关闭)。当我在命令行上运行 Java 程序并向其发送 CTRL+C 时,Java 程序正确地捕获了信号。

但是,当我通过 Go 启动 Java 程序并尝试向进程发送信号时,Java 进程既没有终止也没有处理信号。唯一有效的是 SIGKILL,它当然不会被捕获,只会终止进程。

以下是我的 Go 代码的相关部分:

开始:

startChan := make(chan bool)
go func(startChan chan<- bool) {
    a.Cmd = exec.Command("java", "-jar", "C:\\Code\\sigterm\\TestApp.jar")
    a.Cmd.Stdout = os.Stdout
    a.Cmd.Stderr = os.Stderr

    launchErr := a.Cmd.Start()
    if launchErr != nil {
        fmt.Println("Unable to start app:" + launchErr.Error())
    }
    startChan <- true
}(startChan)

停止:

func (a *App) Stop(timeout time.Duration) {
  a.Cmd.Process.Signal(syscall.SIGQUIT) //Does not work
  a.Cmd.Process.Signal(syscall.SIGTERM) //Does not work
  a.Cmd.Process.Signal(syscall.SIGKILL) //Works
}

顺便说一下,这是在 Windows 上。我通过启动另一个程序(记事本)进行了尝试并得到了相同的结果;也就是说,只有 SIGKILL 有效。我已经确认 Go 获得了正确的 PID 等等,因此信号应该到达正确的位置。

关于如何让它工作的任何想法?

最佳答案

这似乎不受文档中所述的支持:

https://godoc.org/os#Process.Signal

Sending Interrupt on Windows is not implemented.

此外,请参阅此问题讨论以获取有关无法完成的原因的更多背景信息:

https://github.com/golang/go/issues/6720

关于go - SIGKILL 以外的信号不会在 Windows 上终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45309984/

相关文章:

c - 如何在 SIGSEGV 上使用 _Unwind_Backtrace 获取 fullstacktrace

linux - 为什么即使使用 nohup 也能捕获挂断信号?

design-patterns - Go中如何实现策略模式?

go - 如何等待回调函数返回?

go - 安装一个golang包后,它不起作用

pointers - 在循环中重置指针

c - 关于 signal() 函数的奇怪 'SIGSEGV' 性能

python - 在 mac os 和 python 中设置 SIGKILL 处理程序时出现 OSError

C Linux 信号处理

go - 是否可以创建一个 go (golang) 二进制文件来检测单元测试以外的测试的覆盖率?