Proper signal handling in monitor process

This commit is contained in:
Jakob Borg
2014-09-04 23:31:22 +02:00
parent df00a2251e
commit 33e9a88b56
4 changed files with 39 additions and 12 deletions

View File

@@ -9,9 +9,11 @@ import (
"io"
"os"
"os/exec"
"os/signal"
"path/filepath"
"strings"
"sync"
"syscall"
"time"
)
@@ -33,6 +35,10 @@ func monitorMain() {
args := os.Args
var restarts [countRestarts]time.Time
sign := make(chan os.Signal, 1)
sigTerm := syscall.Signal(0xf)
signal.Notify(sign, os.Interrupt, sigTerm, os.Kill)
for {
if t := time.Since(restarts[0]); t < loopThreshold {
l.Warnf("%d restarts in %v; not retrying further", countRestarts, t)
@@ -68,10 +74,23 @@ func monitorMain() {
go copyStderr(stderr)
go copyStdout(stdout)
err = cmd.Wait()
if err == nil {
// Successfull exit indicates an intentional shutdown
exit := make(chan error)
go func() {
exit <- cmd.Wait()
}()
select {
case s := <-sign:
l.Infof("Signal %d received; exiting", s)
cmd.Process.Kill()
<-exit
return
case <-exit:
if err == nil {
// Successfull exit indicates an intentional shutdown
return
}
}
l.Infoln("Syncthing exited:", err)