Удобный скрипт для создания резервных копий

Mar 14, 2016 09:50 · 313 words · 2 minute read backup scripts

Скрипт взят у Alex Efros и несколько видоизменен под свои нужды. Ознакомиться с документацией можно здесь.

В папке /usr/local/etc/powerbackup расположены каталоги с файлами include и exclude — это и есть задания для резервного копирования (файл include содержит пути к файлам/каталогам которые необходимо бекапить, файл exclude содержит пути к файлам/каталогам которые нужно пропустить).

Также в данном скрипте для лучшего сжатия используется архиватор pigz вместо gz, который использовался по умолчанию.

#!/bin/bash
 
unset LANG
TIMEFORMAT=$'%R'
# Путь к конфигу powerbackup
cfg="/usr/local/etc/powerbackup"
# Путь к каталогу для бэкапов
backup="/usr/local/backup"
now=$( date +%Y%m%d_%H%M%S )
touch "$cfg/log.filter"
 
die() { echo "$0: $@" >&2; exit 1; }
# Если в конфиге powerbackup нет заданий для бекапа - выводим сообщение и выходим
if [ "$#" -gt 0 ]; then
    tasks="$@"
else
    tasks=$( find "$cfg" -mindepth 1 -maxdepth 1 -type d \
    -exec basename {} \; | sort )
    [ -n "$tasks" ] || die "no tasks found in $cfg"
fi
# Указываем степень сжатия для архиватора xz
XZ_OPT=-2
export XZ_OPT
# Обрабатываем каждое задание из конфига powerbackup
for task in $tasks; do
    d="$cfg/$task"
    [ -d "$d" ] || die "no such directory: $d"
    printf "%-40s" "Backuping $task ..."
    opt=(-cJ)
    tar="/bin/tar"
    [ -x "$cfg/tar" ] && tar="$cfg/tar"
    [ -x   "$d/tar" ] && tar="$d/tar"
    [ -f "$d/exclude" ] && opt+=(--no-wildcards-match-slash -X "$d/exclude")
    # Если есть файл .snap то делаем инкрементальные бекапы, иначе полные
    snap="$backup/$task.snap"
    if [ -f "$snap" ]; then
        cp "$snap" "$snap.tmp"
        snap="$snap.tmp"
        type="incr"
    else
        type="full"
    fi
    opt+=(-g "$snap")
    # Создаем архив, сохряняем ошибки и статистику
    fname="$backup/$task.$type$now.tar.xz"
    opt+=(-f "$fname")
    [ -s "$d/include" ] || die "no such (or empty) file: $d/include"
    stat=$({ time {
        /usr/bin/ionice -c 3 $tar "${opt[@]}" $(< "$d/include" )
        stat -c "%s" "$fname" || echo "?"
        } 2>"$task.log"
    } 2>&1)
    # Выводим статистику
    printf "%10s bytes, %s sec\n" $stat
    grep -v -f "$cfg/log.filter" "$task.log" | sort -u >&2
    [ "$type" = "incr" ] && rm "$snap"
    rm "$task.log"
done
tweet Share