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

时间:2017-07-25 17:26:09

标签: 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等等,因此信号应该到达正确的位置。

关于如何让它发挥作用的任何想法?

2 个答案:

答案 0 :(得分:4)

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

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

  

未在Windows上发送中断。

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

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

答案 1 :(得分:3)

syscall软件包是针对操作系统(https://golang.org/pkg/syscall/#pkg-overview)量身定制的。 尽管Windows上未实现中断,但可以使用信号发送。

用于Windows的信号包本身中有一个example。 交互式版本(go runhere可用。