Explorar el Código

stop process on exit by catching SIGINT.

Lucas Stadler %!s(int64=11) %!d(string=hace) años
padre
commit
83fa44b2b5
Se han modificado 1 ficheros con 26 adiciones y 2 borrados
  1. 26 2
      go/qst.go

+ 26 - 2
go/qst.go

6
import "log"
6
import "log"
7
import "os"
7
import "os"
8
import "os/exec"
8
import "os/exec"
9
import "os/signal"
9
import "path"
10
import "path"
10
import "strings"
11
import "strings"
11
import "syscall"
12
import "syscall"
66
	}
67
	}
67
68
68
	runner := MakeRunner(fn(file))
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
	runner.Start()
80
	runner.Start()
70
	lastMtime := time.Now()
81
	lastMtime := time.Now()
71
	for {
82
	for {
89
	cmd      *exec.Cmd
100
	cmd      *exec.Cmd
90
	shellCmd string
101
	shellCmd string
91
	started  bool
102
	started  bool
103
	restart  bool
92
}
104
}
93
105
94
func MakeRunner(shellCmd string) *Runner {
106
func MakeRunner(shellCmd string) *Runner {
95
	return &Runner{nil, shellCmd, false}
107
	return &Runner{nil, shellCmd, false, true}
96
}
108
}
97
109
98
func (r *Runner) Start() error {
110
func (r *Runner) Start() error {
110
			log.Printf("%s finished: %s", r.shellCmd, err)
122
			log.Printf("%s finished: %s", r.shellCmd, err)
111
123
112
			time.Sleep(1 * time.Second)
124
			time.Sleep(1 * time.Second)
125
			if !r.restart {
126
				break
127
			}
113
		}
128
		}
114
	}()
129
	}()
115
130
116
	return nil
131
	return nil
117
}
132
}
118
133
119
func (r *Runner) Restart() error {
134
func (r *Runner) Kill() error {
120
	pgid, err := syscall.Getpgid(r.cmd.Process.Pid)
135
	pgid, err := syscall.Getpgid(r.cmd.Process.Pid)
121
	if err == nil {
136
	if err == nil {
122
		syscall.Kill(-pgid, syscall.SIGTERM)
137
		syscall.Kill(-pgid, syscall.SIGTERM)
124
	return err
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
func isFile(file string) bool {
151
func isFile(file string) bool {
128
	info, err := os.Stat(file)
152
	info, err := os.Stat(file)
129
	return err == nil && !info.IsDir()
153
	return err == nil && !info.IsDir()