失败时重试 cron 作业

失败时重试 cron 作业

我有一个 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 日志中看到第二次运行的结果。

相关内容