Вступить в клуб →
сложнаявопросLinux и Bash

Скрипт сбора метрики падает именно в те сутки, когда ошибок не было

Ночная задача считает ошибки в логе и отправляет число в систему мониторинга:

#!/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` конвейер помечается неуспешным

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела