Пример настройки резервного копирования по расписанию
Цель настройки
Создать скрипт, который будет регулярно запускать консольный клиент, архивировать и переносить важные данные в объектное хранилище.
Что нужно для настройки
- консольный клиент (в примере S3cmd с инструментом для автоматизации crontab);
- облачный или выделенный сервер с установленной Ubuntu версии не ниже 18.04;
- пользователь с доступом в объектное хранилище.
Результат настройки
Скрипт создаст резервную копию файла или каталога с помощью tar и загрузит резервную копию в объектное хранилище с помощью s3cmd.
Шаги настройки
- Создайте скрипт.
- Перенесите файлы в объектное хранилище.
- Настроить управление потоком.
- Проверьте скрипт.
- Опционально: автоматизируйте резервное копирование через crontab или Cyberduck.
1. Создать скрипт
-
Откройте на своем сервере домашнюю директорию:
cd ~
-
С помощью редактора nano создайте пустой файл (например, с именем
bkupscript
):nano bkupscript.sh
-
Начните писать скрипт резервного копирования в текстовом редакторе с шебанга:
#!/bin/bash
Шебанг — это директива интерпретатора, которая позволяет запускать скрипты или файлы данных как команды и выглядит как последовательность из двух символов:
#
и!
. Благодаря шебангу в начале скрипта оболочка запускает команды файла в bash. -
Под шебангом в верхней части текстового файла добавьте в скрипт переменные:
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3Здесь:
DATETIME
— метка времени, которую нужно прикрепить к имени полученного файла. Каждый файл, резервная копия которого хранится в пространстве, будет иметь уникальное имя. Эта временная метка создается путем вызова командыdate
и форматирования вывода для отображения двух последних цифр года (% y
), двух цифр месяца (% m
), двух цифр дня (% d
), час (% H
), минуты (% M
) и секунды (% S
);SRC
— исходный путь для файла или папки, в которую делается резервная копия.$1
указывает, что значение берется из первого параметра, переданного скрипту;DST
— место назначения файла. В примере это имя пространства, в которое загружается резервная копия. Это имя будет получено из второго параметра, переданного в скрипт, как указано в$2
;GIVENNAME
— выбранное пользователем имя для файла назначения. Результирующее имя файла будет начинаться сGIVENNAME
, и к нему будет добавленоDATETIME
. Это имя происходит от третьего параметра, переданного скрипту$3
.
-
Добавьте функцию
showhelp
в скрипт резервного копирования для вывода сообщений в случае сбоя работы скрипта:#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(
echo "\n This script will backup files/folders into a single compressed file and will store it in the current folder."
} -
Соберите нужные файлы и объедините их в единый пакет, который можно будет загрузить:
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(
echo "\n This script will backup files/folders into a single compressed file and will store it in the current folder."
){
}
tarandzip(){
echo "\n##### Gathering files #####\n"
tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC
}Когда вызывается инструкция
if
, скрипт выполняет командуtar
и ожидает результата. Если команда выполнена успешно, будут выполнены строки после оператораthen
:- вывод сообщения о том, что процесс
tar
успешно завершился; - возвращение кода ошибки
0
, чтобы часть кода, вызывающая эту функцию, знала, что все работает нормально.
Часть
else
скрипта будет выполняться только в том случае, если командаtar
обнаружит ошибку при выполнении:- вывод сообщения о том, что команда
tar
не выполнена; - возвращение кода ошибки 1, что указывает на то, что что-то пошло не так.
- вывод сообщения о том, что процесс
-
Закончите скрипт
if/then/else
фразойfi
. Вид завершенной функцииtarandzip
:tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
2. Перенести файлы в объектное хранилище
-
Добавьте в скрипт резервного копирования функцию передачи файла
movetoSpace
в выбранное пространство. Для создания команды, которая будет помещать файлы резервных копий в выбранное пространство, используются объявленные ранее переменные:movetoSpace(){
/bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}Здесь:
/bin/s3cmd
— вызывает s3cmd — инструмент командной строки, используемый для управления сегментами хранилища объектов;put
— используется s3cmd для загрузки данных в контей нер;$ GIVENNAME- $ DATETIME.tar.gz
— имя резервной копии, которая будет загружена в пространство. Он состоит из четвертой и первой объявленных переменных, за которыми следует.tar.gz
, и создается функциейtarandzip
;s3: // $ DST ;
— место, куда будет загружен файл;s3: //
— схема типа URI, используемая для описания мест хранения объектов в сети, а$DST;
— это третья переменная, которую объявили ранее.
-
Добавьте уведомление о том, что процесс переноса файлов начался:
movetoSpace(){
echo “\n##### MOVING TO SPACE #####\n”
/bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
} -
Настройте вывод сообщения о результате выполнении команды:
if /bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
3. Настроить управление потоком
Если скрипт настроен правильно, при запуске он должен прочитать команду ввода, присвоить значения из нее каждой переменной, выполнить функцию tarandzip
, а затем выполнить movetoSpace
.
Если сценарий завершится неудачно на любом шаге, он должен напечатать вывод функции showhelp
, чтобы помочь в устранении неполадок.
В конец файла добавьте условную инструкцию if / then / else
:
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi
4. Проверить скрипт
-
Проверьте скрипт:
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(){
echo "\n This script will backup files/folders into a single compressed file and will store it in the current folder."
}
tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
if /bin/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Spac #####\n"
return 1
fi
}
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi -
Перед выходом из nano закройте файл (Ctrl+Х) и сохраните внесенные изменения (Y+Enter).
5. Опционально: автоматизировать резервное копирование
Crontab
Cyberduck
-
Настройте задание cron, которое будет использовать скрипт для регулярного резервного копирования в выбранное пространство. В рамках этого примера резервное копирование будет выполняться каждую минуту.
-
Сделайте скрипт исполняемым:
chmod +x bkupscript.sh
-
Отредактируйте файл crontab, чтобы скрипт запускался каждую минуту:
crontab -e
-
При первом запуске команды
crontab -e
будет предложено выбрать редактор из списка:no crontab for root - using an empty one
Select an editor. To change later, run "select-editor".
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]: