mattn / goemon

五右衛門
182 stars 14 forks source link

restart and signal receive on same goroutine #8

Closed soh335 closed 7 years ago

soh335 commented 7 years ago

日本語で失礼します。

起きてること

 ~  goemon sleep 100
GOEMON 2017/01/24 13:05:55 goemon.go:273: open /Users/soh335/goemon.yml: no such file or directory
GOEMON 2017/01/24 13:05:55 goemon.go:277: loading /Users/soh335/goemon.yml
GOEMON 2017/01/24 13:05:55 goemon.go:314: starting command [sleep 100]
GOEMON 2017/01/24 13:05:55 goemon.go:294: starting livereload

^CGOEMON 2017/01/24 13:05:58 goemon.go:318: signal: interrupt
GOEMON 2017/01/24 13:05:59 goemon.go:321: restarting command
GOEMON 2017/01/24 13:05:59 proc_posix.go:21: os: process already finished
 ~  ps ax | grep sleep
76828 s006  S      0:00.00 sleep 100

signal を受けてから terminate している間に5秒間 sleep してしまうのでその間に再度 restart が走ってしい、その後 os.Exit で goemon だけ落ちてしまうという状態のようです。( process に signal 送った場合は ProcessState.Exited() が false になるようなので)

とりあえず再起動と終了を同じ goroutine で受けるようにして同時に処理しないようにしてみました。

ただ、プロセスが終わっていたら sleep の loop を抜ける、 process がまだ終わっていなかったら kill するという意味だったらこうなのかな?とも感じました。

diff --git a/proc_posix.go b/proc_posix.go
index 6a683d7..ce7a4fa 100644
--- a/proc_posix.go
+++ b/proc_posix.go
@@ -22,14 +22,14 @@ func (g *goemon) terminate() error {
                } else {
                        cd := 5
                        for cd > 0 {
-                               if g.cmd.ProcessState != nil && g.cmd.ProcessState.Exited() {
+                               if g.cmd.ProcessState != nil {
                                        break
                                }
                                time.Sleep(time.Second)
                                cd--
                        }
                }
-               if g.cmd.ProcessState != nil && g.cmd.ProcessState.Exited() {
+               if g.cmd.ProcessState == nil {
                        g.cmd.Process.Kill()
                }
        }

勘違いしていたらすいません!

環境

$ go version
go version go1.7.4 darwin/amd64
mattn commented 7 years ago

あざます!