8 def get_args() -> argparse
.ArgumentParser
:
9 parser
= argparse
.ArgumentParser()
10 parser
.add_argument("--delay", action
="store", type=float, default
=3, help="Initial delay before retry, in seconds")
11 parser
.add_argument("--count", action
="store", type=int, default
=5, help="Total number of tries")
12 parser
.add_argument("--factor", action
="store", type=float, default
=2, help="Exponential backoff factor")
13 parser
.add_argument("cmd", nargs
=argparse
.REMAINDER
)
17 def log(value
: str) -> None:
23 args
= get_args().parse_args()
26 log("No command supplied")
31 for n
in range(args
.count
):
33 log("Running %s [try %d/%d]" % (" ".join(args
.cmd
), (n
+1), args
.count
))
34 subprocess
.check_call(args
.cmd
)
35 except subprocess
.CalledProcessError
as e
:
36 retcode
= e
.returncode
38 log("Command succeeded")
43 wait_time
= (n
+1) * args
.delay
45 wait_time
= args
.factor
**n
* args
.delay
46 if n
< args
.count
- 1:
47 log("Command failed, waiting %s seconds to retry" % wait_time
)
50 log("Command failed, out of retries")
55 if __name__
== "__main__":