リソースが利用できないときに定期的に失敗する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
。
クローン自体内で最初のコマンドが失敗した場合は、スケジュールをリセットできます。
<command> || at now + 17 minutes <command>
at
最初のコマンドが失敗した場合にのみ、コマンドは再スケジュールされます。もちろん、スケジュールは一度だけ変更され、2回目の実行も失敗すると再実行されません。
ここで唯一の注意点は、一部の可視性が失われることです。たとえば、メールまたはクローンログで2番目の実行結果を見ることはできません。