Удобный скрипт для создания резервных копий
Mar 14, 2016 09:50 · 313 words · 2 minute read
Скрипт взят у 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