Goは、GoがSIGQUITやSIGTERMのようなシグナルを送信できることを証明する目的で、Goを使って簡単なJavaアプリケーションを起動します。正常にシャットダウン)。コマンドラインでJavaプログラムを実行し、CTRL + Cを送信すると、Javaプログラムは正しくシグナルをキャッチします。SIGKILL以外のシグナルはWindows上でプロセスを終了しません
しかし、GoでJavaプログラムを起動してプロセスにシグナルを送信しようとすると、Javaプロセスは終了せずシグナルを処理しません。唯一効果があるのはSIGKILLですが、これはもちろん捕らえられず、単にプロセスを殺します。これは、方法によって、Windows上で
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
}
:
スタート:
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)
停止ここ
は私の囲碁コードの関連部分です。私は別のプログラム(ノートパッド)を起動して試してみたところ、同じ結果が得られました。つまり、SIGKILLだけが働いていました。私は、Goが正しいPIDなどを取得していることを確認したので、信号が適切な場所に送られるはずです。
どのように私はこれを動作させることができますか?
Windowsは、実際にすべてのPOSIXスタイルのIPCの信号をサポートしていません。 SIGKILLは、この場合、ターゲットプロセスを終了することによってエミュレートされます。 – Adrian