我有一个 cron 作业,当资源不可用时,它会定期失败。等待一段时间然后重试是处理此类失败的最佳方法。做这个的最好方式是什么?失败的脚本是否使用重新安排自身at
?有更好的方法吗?也许已经有这样的重试基础设施。
答案1
需要不断重试直到服务可用,因此构建了一个专用工具来执行此操作。
https://github.com/minfrin/retry
~$ retry --until=success -- false
retry: 'false' returned 1, backing off for 10 seconds and trying again...
retry: 'false' returned 1, backing off for 10 seconds and trying again...
retry: 'false' returned 1, backing off for 10 seconds and trying again...
^C
在最新的 Debian、Ubuntu 和 Nix 中开箱即用。
答案2
安排一个运行您的作业的脚本。让脚本重试运行作业,直到成功或尝试次数过多。
这假设您的作业是通过运行来执行的some-command
,并且通过返回非零退出状态来优雅地失败:
#!/bin/sh
sleeptime=15m # Sleep for 15 minutes after a failed try.
maxtries=8 # 8 * 15 minutes = about 2 hours total of waiting,
# not counting running and failing.
while ! some-command; do
maxtries=$(( maxtries - 1 ))
if [ "$maxtries" -eq 0 ]; then
echo Failed >&2
exit 1
fi
sleep "$sleeptime" || break
done
答案3
重新安排时间at now + 17 minutes
就可以了。读man at
。
在 cron 本身中,您可以重新安排它,以防第一个命令失败:
<command> || at now + 17 minutes <command>
at
仅当第一个命令失败时,才会重新安排该命令。当然,它只会重新安排一次,如果第二次运行也失败,则不会重新运行。
这里唯一需要注意的是,会失去一些可见性,例如,您不会在邮件或 cron 日志中看到第二次运行的结果。