From d564e5ae7dd70f0ce3b2aa56bc5fd00c873d2330 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Sat, 14 Feb 2015 09:34:31 -0700 Subject: [PATCH] Add respawn command --- main.go | 2 ++ respawn/respawn.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 respawn/respawn.go diff --git a/main.go b/main.go index ac1cfd6d..ef6bb34b 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( log "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/reexec" osInit "github.com/rancherio/os/init" + "github.com/rancherio/os/respawn" "github.com/rancherio/os/sysinit" "github.com/rancherio/os/user" ) @@ -17,6 +18,7 @@ func main() { reexec.Register("/sbin/init-sys", sysinit.SysInit) reexec.Register("/usr/bin/system-docker", user.SystemDocker) reexec.Register("system-docker", user.SystemDocker) + reexec.Register("respawn", respawn.Main) if !reexec.Init() { log.Fatalf("Failed to find an entry point for %s", os.Args[0]) diff --git a/respawn/respawn.go b/respawn/respawn.go new file mode 100644 index 00000000..a5d098e0 --- /dev/null +++ b/respawn/respawn.go @@ -0,0 +1,65 @@ +package respawn + +import ( + "io/ioutil" + "os" + "os/exec" + "strings" + "sync" + "time" + + log "github.com/Sirupsen/logrus" +) + +func Main() { + input, err := ioutil.ReadAll(os.Stdin) + if err != nil { + panic(err) + } + + var wait sync.WaitGroup + + for _, line := range strings.Split(string(input), "\n") { + wait.Add(1) + go execute(line, wait) + } + + wait.Wait() +} + +func execute(line string, wait sync.WaitGroup) { + start := time.Now() + count := 0 + + for { + args := strings.Split(line, " ") + + cmd := exec.Command(args[0], args[1:]...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + err := cmd.Start() + if err != nil { + log.Error("%s : %v", line, err) + } + + err = cmd.Wait() + if err != nil { + log.Error("%s : %v", line, err) + } + + count++ + + if count > 10 { + if start.Sub(time.Now()) <= (1 * time.Second) { + log.Errorf("%s : restarted too fast, not executing", line) + break + } + + count = 0 + start = time.Now() + } + } + + wait.Done() +}