diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-25 14:42:55 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-25 14:42:55 -0600 |
| commit | 8e0834741617234a6ace6e7624d58f3c6335319b (patch) | |
| tree | 46e235e172c91557d41d218733d37377606551e2 | |
| parent | 725b9f91042d888f99b1760b1a1e226a80960b6f (diff) | |
feat: restart crashing process until shutdown signal is received
| -rw-r--r-- | main.go | 24 |
1 files changed, 20 insertions, 4 deletions
@@ -7,7 +7,9 @@ import ( "os/signal" "strings" "sync" + "sync/atomic" "syscall" + "time" ) func main() { @@ -16,6 +18,7 @@ func main() { var cmds []*exec.Cmd var wg sync.WaitGroup + var shutdown int32 scanner := bufio.NewScanner(file) for scanner.Scan() { @@ -42,11 +45,22 @@ func main() { cmds = append(cmds, cmd) wg.Add(1) - go func(c *exec.Cmd) { + go func(args []string) { defer wg.Done() - c.Start() - c.Wait() - }(cmd) + for atomic.LoadInt32(&shutdown) == 0 { + cmd := exec.Command(args[0], args[1:]...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + + if cmd.Start() != nil { + time.Sleep(2 * time.Second) + continue + } + cmd.Wait() + time.Sleep(time.Second) + } + }(args) } sigChan := make(chan os.Signal, 1) @@ -54,6 +68,8 @@ func main() { go func() { <-sigChan + atomic.StoreInt32(&shutdown, 1) + for _, cmd := range cmds { if cmd.Process != nil { syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM) |
