main.go 763 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log/slog"
  6. "os"
  7. "os/exec"
  8. "strings"
  9. "time"
  10. )
  11. var (
  12. startWait = flag.Duration("start-wait", 250*time.Millisecond, "amount of time to start with exponential backoff")
  13. tryCount = flag.Int("try-count", 5, "number of retries")
  14. )
  15. func main() {
  16. flag.Parse()
  17. cmdStr := strings.Join(flag.Args(), " ")
  18. wait := *startWait
  19. for i := range make([]struct{}, *tryCount) {
  20. slog.Info("executing", "try", i+1, "wait", wait, "cmd", cmdStr)
  21. cmd := exec.Command("sh", "-c", cmdStr)
  22. cmd.Stdin = nil
  23. cmd.Stdout = os.Stdout
  24. cmd.Stderr = os.Stderr
  25. if err := cmd.Run(); err != nil {
  26. time.Sleep(wait)
  27. wait = wait * 2
  28. } else {
  29. os.Exit(0)
  30. }
  31. }
  32. fmt.Printf("giving up after %d tries\n", *tryCount)
  33. os.Exit(1)
  34. }