Проверяем свободное место перед backup-скриптом!
Очень частая проблема в автоматизации. Backup запускается по cron, архив начинает писаться, а потом диск заканчивается посередине процесса. В итоге получается битый файл, лишняя нагрузка и непонятная ошибка в логах.
Перед созданием архива лучше заранее проверить, хватает ли места.
Сначала зададим директорию и минимальный запас в килобайтах:
backup_dir="/var/backups/app"
min_free_kb=1048576
Теперь получим свободное место через df. Ключ -P делает вывод предсказуемым для скриптов:
free_kb=$(df -Pk "$backup_dir" | awk "NR == 2 {print $4}")
Если места меньше нужного, завершаем скрипт с ошибкой:
if [ "$free_kb" -lt "$min_free_kb" ]; then
echo "not enough disk space" >&2
exit 1
fi
После проверки можно спокойно запускать архивирование:
tar -czf "$backup_dir/app.tar.gz" /opt/app/data
Для cron полезно добавить дату в имя файла, чтобы старые архивы не перезаписывались:
stamp=$(date +%Y%m%d-%H%M%S)
archive="$backup_dir/app-$stamp.tar.gz"
И использовать переменную archive:
tar -czf "$archive" /opt/app/data
Если нужно контролировать размер каталога заранее, можно примерно оценить его через du:
need_kb=$(du -sk /opt/app/data | awk "{print $1}")
Тогда проверка станет ближе к реальности:
if [ "$free_kb" -lt "$need_kb" ]; then
echo "backup may not fit" >&2
exit 1
fi
Такой скрипт не делает backup умнее сам по себе, но убирает неприятный класс ошибок. Лучше упасть до начала операции, чем получить недописанный архив и узнать об этом только при восстановлении.
➡️ DevOps Ready | #практика
Очень частая проблема в автоматизации. Backup запускается по cron, архив начинает писаться, а потом диск заканчивается посередине процесса. В итоге получается битый файл, лишняя нагрузка и непонятная ошибка в логах.
Перед созданием архива лучше заранее проверить, хватает ли места.
Сначала зададим директорию и минимальный запас в килобайтах:
backup_dir="/var/backups/app"
min_free_kb=1048576
Теперь получим свободное место через df. Ключ -P делает вывод предсказуемым для скриптов:
free_kb=$(df -Pk "$backup_dir" | awk "NR == 2 {print $4}")
Если места меньше нужного, завершаем скрипт с ошибкой:
if [ "$free_kb" -lt "$min_free_kb" ]; then
echo "not enough disk space" >&2
exit 1
fi
После проверки можно спокойно запускать архивирование:
tar -czf "$backup_dir/app.tar.gz" /opt/app/data
Для cron полезно добавить дату в имя файла, чтобы старые архивы не перезаписывались:
stamp=$(date +%Y%m%d-%H%M%S)
archive="$backup_dir/app-$stamp.tar.gz"
И использовать переменную archive:
tar -czf "$archive" /opt/app/data
Если нужно контролировать размер каталога заранее, можно примерно оценить его через du:
need_kb=$(du -sk /opt/app/data | awk "{print $1}")
Тогда проверка станет ближе к реальности:
if [ "$free_kb" -lt "$need_kb" ]; then
echo "backup may not fit" >&2
exit 1
fi
Такой скрипт не делает backup умнее сам по себе, но убирает неприятный класс ошибок. Лучше упасть до начала операции, чем получить недописанный архив и узнать об этом только при восстановлении.
➡️ DevOps Ready | #практика