我正在通过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
在Windows上未实现发送中断。
另外,请参阅此问题讨论以获取有关为何无法完成操作的更多信息:
https://github.com/golang/go/issues/6720