瀏覽代碼

stop process on exit by catching SIGINT.

Lucas Stadler 11 年之前
父節點
當前提交
83fa44b2b5
共有 1 個文件被更改,包括 26 次插入2 次删除
  1. 26 2
      go/qst.go

+ 26 - 2
go/qst.go

@ -6,6 +6,7 @@ import "fmt"
6 6
import "log"
7 7
import "os"
8 8
import "os/exec"
9
import "os/signal"
9 10
import "path"
10 11
import "strings"
11 12
import "syscall"
@ -66,6 +67,16 @@ func main() {
66 67
	}
67 68
68 69
	runner := MakeRunner(fn(file))
70
	go runCmd(file, runner)
71
72
	c := make(chan os.Signal, 1)
73
	signal.Notify(c, os.Interrupt, os.Kill)
74
	s := <-c
75
	log.Printf("got signal: %s, exiting...", s)
76
	runner.Stop()
77
}
78
79
func runCmd(file string, runner *Runner) {
69 80
	runner.Start()
70 81
	lastMtime := time.Now()
71 82
	for {
@ -89,10 +100,11 @@ type Runner struct {
89 100
	cmd      *exec.Cmd
90 101
	shellCmd string
91 102
	started  bool
103
	restart  bool
92 104
}
93 105
94 106
func MakeRunner(shellCmd string) *Runner {
95
	return &Runner{nil, shellCmd, false}
107
	return &Runner{nil, shellCmd, false, true}
96 108
}
97 109
98 110
func (r *Runner) Start() error {
@ -110,13 +122,16 @@ func (r *Runner) Start() error {
110 122
			log.Printf("%s finished: %s", r.shellCmd, err)
111 123
112 124
			time.Sleep(1 * time.Second)
125
			if !r.restart {
126
				break
127
			}
113 128
		}
114 129
	}()
115 130
116 131
	return nil
117 132
}
118 133
119
func (r *Runner) Restart() error {
134
func (r *Runner) Kill() error {
120 135
	pgid, err := syscall.Getpgid(r.cmd.Process.Pid)
121 136
	if err == nil {
122 137
		syscall.Kill(-pgid, syscall.SIGTERM)
@ -124,6 +139,15 @@ func (r *Runner) Restart() error {
124 139
	return err
125 140
}
126 141
142
func (r *Runner) Restart() error {
143
	return r.Kill()
144
}
145
146
func (r *Runner) Stop() {
147
	r.restart = false
148
	r.Kill()
149
}
150
127 151
func isFile(file string) bool {
128 152
	info, err := os.Stat(file)
129 153
	return err == nil && !info.IsDir()