Надёжные retry в Bash с backoff и контролем ошибок

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

bashretrybackoff

👁 В автоматизации на 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 #оптимизация #полезно

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот кода в тёмной теме: универсальная функция retry для Bash с backoff, set -o pipefail и примером curl с jitter
Пример реализации retry в Bash с backoff, set -o pipefail и jitter

Читайте так же