Скрипт для резервного копирования

Всем привет, обновил скрипт для резервного копирования с учётом того, что я вообще-то программист, а не просто айтишник! Он стал более интеллектуально определять и удалять старые файлы, учитывать ограничение в 4.5Gb (на FTP для бекапа доступно 5Gb) и успешность операций, добавлены сообщения об ошибках. И бонусом сообщения раскрашены в разные цвета, нейтральные выделены жирным, хорошие зелёным, а плохие красным цветом — красота! Скрипт проверен на сайте ShellCheck, который я настоятельно рекомендую к использованию. Если найдёте ошибку или вам есть что добавить, смело пишите комментарий.

#!/usr/local/bin/bash
 
# Основная папка для архивов
BACKUP_ROOT=/var/backups/manual/
# Папка, куда непоредственно пишем файлы, выглядит как BACKUP_ROOT/ГОД/МЕСЯЦ/ДЕНЬ
BACKUP_DIR="$BACKUP_ROOT"$(date +"%Y/%m/%d")
# Время запуска скрипта. Все файлы имеют вид имя_файла_%ЧАС%%МИНУТА%.tag.bz2
TIME=$(date +"%H%M")
# Ограничение хранилища в килобайтах для проверки
LIMIT=$(echo "4096*2^10"|bc)
# Ограничение хранилища в мегабайтах для вывода в сообщениях
HLIMIT=$(echo "$LIMIT/1024"|bc)"Mb"
 
# Функция выход в случае ошибки
exit_on_error() {
    # Получаем код ошибки
    exit_code=$?
    # Входное сообщение
    message=$1
    if [ $exit_code -ne 0 ]; then
        # Выводим сообщение в stderr
        >&2 echo -e "\e[31m${message}\e[0m"
        # Выходим к кодом exit_code
        exit $exit_code
    fi
}
 
# Если папки нет
if [ ! -d "$BACKUP_DIR" ]; then
    # Создаём папку со всеми промежуточными подпапками
    mkdir -p "$BACKUP_DIR"
fi
 
printf "\e[1mSearching space for backup\e[0m .. "
# Цикл от 100 дней до нуля
for days in $(seq 100 -1 0)
do
    SIZE=$(du -sB 1 $BACKUP_ROOT | cut -f 1)
    HSZ=$(echo "$SIZE/1024"|bc)"Mb"
    # Если размер хранилища не превышает лимита
    if [[ $SIZE -le $LIMIT ]]; then
        # Выводим сообщение и прерываем цикл
        printf "[%s/%s] .. " "$HSZ" "$HLIMIT"
        break
    fi
    # Если нет ни одного файла старше $days дней
    if [[ -z "$(find $BACKUP_ROOT -type f -mtime +"$days")" ]]; then
        # Продолжаем цикл
        continue
    fi
    printf "\e[31m%s/%s]\e[0m .. " "$HSZ" "$HLIMIT"
    # Удаление файлов старше $days прошло успешно
    if find $BACKUP_ROOT -type f -mtime +"$days"d -delete > /dev/null; then
        # Выводим сообщение 
        printf "CLEAN (older than %s days) .. " "$days"
    else
        # Выходим с сообщением FAIL
        exit_on_error "FAIL"
    fi
    # Удаляем пустые папки, чтоб не мусорить
    find $BACKUP_ROOT -empty -type d -delete
done
echo -e "\e[32mOK\e[0m"
 
printf "\e[1mBackuping etc files\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/etc_"$TIME".tar.bz2 /etc /usr/local/etc /home /var/db/ports /var/named/etc/namedb /root/scripts > /dev/null 2>&1 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"
 
printf "\e[1mBackuping www folder\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/www_"$TIME".tar.bz2 /usr/local/www > /dev/null && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"
 
printf "\e[1mBackuping SQL databases\e[0m .. "
/usr/local/bin/mysqldump --login-path=backup --opt --all-databases --triggers --routines --events | bzip2 -c > "$BACKUP_DIR"/sql_"$TIME".sql.bz2 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"

Откровенно говоря, не до конца понимаю, в каких единицах считает занятое место команда du. Предполагаю, что в килобайтах.

P.S. Для того, чтобы получить вывод без цвета, использую утилиту textproc/ansifilter:

script.sh | ansifilter --text
Комментариев нет. Будьте первым!
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Блог Евгения Жирнова