Скрипт сбора метрики падает именно в те сутки, когда ошибок не было
Ночная задача считает ошибки в логе и отправляет число в систему мониторинга:
#!/bin/bash
set -euo pipefail
count=$(grep -c "ERROR" /var/log/app/app.log)
echo "ошибок за сутки: $count"
send_metric "app_errors_total" "$count"
Почти всегда всё работает. Но в дни, когда в логе нет ни одной строки ERROR, задача помечается как упавшая, а метрика за эти сутки в мониторинге отсутствует.
Что происходит?
- `grep -c` при нуле совпадений печатает 0, но возвращает 1, и из-за `set -e` скрипт завершается на строке присваивания — метрика не отправляется
- `count` получает пустую строку, режим `set -u` считает переменную незаданной и обрывает скрипт на строке с `send_metric` — до отправки метрики выполнение просто не доходит
- Подстановка команд не наследует `set -e`, поэтому падает уже `echo` с пустым аргументом
- `grep -c` на пустом результате пишет в stderr, и из-за `pipefail` конвейер помечается неуспешным
