Всем привет, обновил скрипт для резервного копирования с учётом того, что я вообще-то программист, а не просто айтишник! Он стал более интеллектуально определять и удалять старые файлы, учитывать ограничение в 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 |