👁 В автоматизации на Bash часто делают примитивные retry: for i in {1..3}; do .... Это плохо работает в проде — нет контроля ошибок в пайпах, нет backoff, и при массовых сбоях скрипты начинают «ддосить» сервис. Нормальный retry должен учитывать код выхода и увеличивать задержку.
📝 Универсальная функция retry с backoff
Можно обернуть любую команду в функцию, которая будет повторять её с увеличивающейся задержкой.
retry() {
local retries=$1
shift
local count=0
local delay=1
until "$@"; do
exit_code=$?
count=$((count + 1))
if [ $count -ge $retries ]; then
return $exit_code
fi
sleep $delay
delay=$((delay * 2))
done
}📌 Теперь можно использовать её для любых команд:
retry 5 curl -f https://api.example.com
📝 Корректная работа с пайпами через pipefail
Если команда внутри пайпа падает, Bash по умолчанию этого не видит. Это ломает retry-логику. Теперь retry сработает, даже если упала не последняя команда в пайпе.
set -o pipefail retry 3 sh -c 'curl -s https://api | jq .data'
📝 Добавление jitter для защиты от массовых ретраев
Чтобы избежать одновременных повторов (например, в CI или на нескольких серверах), можно добавить случайную задержку. Это снижает риск перегрузки внешних сервисов при массовых ошибках.
sleep $((delay + RANDOM % delay))
❗️ Хороший retry — это не «повтори пару раз», а контроль нагрузки и ошибок. В проде именно такие детали решают, будет система стабильной или сама себя уронит.
tags: #bash #оптимизация #полезно



