🐛 Типичные ошибки — Занятие 24

К оглавлению урока

⚡ Топ-3 ошибки

  1. find -delete без проверки — сначала -print, только потом -delete
  2. Нет sort перед uniq -cuniq считает только соседние одинаковые строки
  3. Числовое сравнение строкой — используйте -gt, не >
⚠️ ВАЖНО: find … -mtime +21 -delete
Флаг -delete необратимо удаляет файлы без корзины. Это применяется в задаче 3 для удаления старых архивов. Всегда перед реальным запуском делайте тестовый прогон:
# Тестовый прогон — только показывает что будет удалено
find "$backup_location" -maxdepth 1 -type f -name "*.tar.gz" -mtime +21 -print

# Только после проверки — реальное удаление
find "$backup_location" -maxdepth 1 -type f -name "*.tar.gz" -mtime +21 -delete
Также убедитесь, что переменная $backup_location не пустая — иначе find может удалить файлы из непредвиденного места.

Ошибка 1 — uniq -c без предварительного sort

uniq считает только соседние одинаковые строки. Без sort результат будет неверным.
# НЕВЕРНО: одинаковые строки могут быть разбросаны
grep -E -r "$patterns" /var/log | uniq -c

# ВЕРНО: сначала сортируем, потом считаем
grep -E -r "$patterns" /var/log | sort | uniq -c | sort -nr

Ошибка 2 — Сравнение строки вместо числа

# НЕВЕРНО: строковое сравнение (может дать неожиданный результат)
if [ "$disk_usage" > "$threshold" ]; then

# ВЕРНО: числовое сравнение
if [ "$disk_usage" -gt "$threshold" ]; then

В bash числовые операторы: -eq (равно), -ne (не равно), -lt (меньше), -le (меньше или равно), -gt (больше), -ge (больше или равно).

Ошибка 3 — Не убран знак % при получении числа от df

# df выводит "70%" — это строка, не число
disk_usage=$(df / | awk '{print $5}')
# disk_usage = "70%" — сравнение с числом провалится

# ВЕРНО: убрать %
disk_usage=$(df / | awk '{print $5}' | sed 's/%//')

Ошибка 4 — Нет mkdir -p перед созданием архива

# НЕВЕРНО: директория может не существовать
tar -czf /backup/opt_backup_2024-01-15.tar.gz /opt
# Ошибка: /backup: No such file or directory

# ВЕРНО: создать директорию заранее
mkdir -p "$backup_location"
tar -czf "$backup_file" "$dir"

Ошибка 5 — Пустая переменная backup_location в find -delete

Если $backup_location пустая, команда find "" -delete может начать поиск от текущей директории.
# Защита: проверка непустой переменной
if [ -z "$backup_location" ]; then
    echo "ERROR: backup_location is not set"
    exit 1
fi
find "$backup_location" -maxdepth 1 -type f -name "*.tar.gz" -mtime +21 -delete

Ошибка 6 — Расписание cron: день недели 7 вместо 0

# Оба варианта означают воскресенье, но 0 — более совместимый
0 2 * * 7   # работает на большинстве систем
0 2 * * 0   # стандартный вариант (0 = воскресенье)