2017-07-25 8 views
0

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などを取得していることを確認したので、信号が適切な場所に送られるはずです。

どのように私はこれを動作させることができますか?

+1

Windowsは、実際にすべてのPOSIXスタイルのIPCの信号をサポートしていません。 SIGKILLは、この場合、ターゲットプロセスを終了することによってエミュレートされます。 – Adrian

答えて

4

ドキュメントに記載されているように、これはサポートされていないようです:

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

実装されていないWindows上で割り込みを送信します。

また、それは行われなかった理由についてより多くのコンテキストを取得するには、この問題の議論を参照してください。

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

関連する問題