Резервне копіювання в Linux з використанням BASH + CRON

Люба х...ня

Резервне копіювання на будь-якому сервері є вкрай важливим завданням. Особливо коли проекти виконуються протягом кількох місяців.

Погодьтесь, робити кожного дня бекапи проектів, не надто цікава робота. Або якщо у вас кілька робочих машин і на всіх потрібно робити копії актуальних проектів.

Про SVN поговоримо пізніше :).

Отже, сьогодні створимо скрипт на bash і додамо виконання скрипта по cron.

Завдання:

Написати скрипт на BASH, який створюватиме резервні копії проекту разом з БД. Запустити його на виконання в cron.

Для цього нам потрібно:

Створити файл: touch /home/wg/sb

Покласти в нього скрипт на bash:

#!/bin/bash
 
HOSTNAME=$1 # Назва проекту
DB_NAME=$2 # Назва БД
DB_HOST="127.0.0.1" # localhost
DB_USER="root" # користувач БД
DB_PASS="hp" # пароль користувача БД
SOURCE_DIRECTORY="/var/www/$HOSTNAME"           #Шлях до папки з проектом
DIRECTORY_TO_BACKUP="/home/wg/ProjectsBackup/$HOSTNAME/"       #Куди бекапити
LOG_FILE="/var/log/ProjectsBackup.log"               #Лог файл
 
function CreateBackup()
{
  mysqldump -u$DB_USER -h$DB_HOST -p$DB_PASS $DB_NAME > $SOURCE_DIRECTORY/$DB_NAME.sql
  tar -cvzf ${DIRECTORY_TO_BACKUP}`date "+%Y-%m-%d_%s"`.tar.gz $SOURCE_DIRECTORY
  echo $?
  echo "`date` Створення резервної копії $SOURCE_DIRECTORY завершено." >> $LOG_FILE
}
 
if [[ ! -d $DIRECTORY_TO_BACKUP ]]; then
        echo "`date` Не знайдено каталог для бекапу. Створення." >> $LOG_FILE
	mkdir -p $DIRECTORY_TO_BACKUP 
fi
	CreateBackup
 
###

Думаю що коментувати його не потрібно, так як все зрозуміло. Змінні $1,$2 передаватимуться командою з крону.

Зробимо наш скрипт виконуваним:

sudo chmod +x /home/wg/sb

Скрипт готовий. Залишилося запускати його в певний час. В *nix системах існує така чарівна річ як cron. Він дозволяє здійснити неодноразовий запуск завдань. Тобто завдання можна запустити в певний день, годину, хвилину, або запускати через певний проміжок часу. Наше завдання запускати наш скрипт від привілейованого користувача root. Для створення файлу завдань будемо використовувати crontab. Файли завдань crontab містять інструкції для демона cron, який запустить завдання описане у файлі.

Створимо каталог і файл наших завдань:

sudo mkdir /home/wg/crontab
sudo nano /home/wg/crontab/sbt

Помістимо наступний текст в файл sbt

SHELL=/bin/bash
0 18 */1 * * /home/wg/sb project.loc db_name

Де project.loc - назва хоста в на локальному сервері, db_name - назва БД Запускаємо скрипт від root Використовуємо наступні команди:

sudo crontab /home/wg/crontab/sbt

Ось і все.

Залишилось перевірити чи додалось завдання в cron командою:

sudo crontab -l

Очистити список завдань можна так:

sudo crontab -r

І на остаток.

Опис налаштувань по crontab

Кожен рядок у файлі /etc/crontab має наступний формат:

minute   hour   day   month   dayofweek   command

Де:

  • minute  будь-яке ціле число від 0 до 59.
  • hour  будь-яке ціле від 0 до 23.
  • day  будь-яке ціле від 1 до 31 (день повинен бути коректним, якщо вказано місяць).
  • month  будь-яке ціле від 1 до 12 (або коротку назву місяця, наприклад: jan, feb і так далі).
  • dayofweek  будь-яке ціле від 0 до 7, де 0 або 7 означає неділю (або коротку назву дня тижня, наприклад: sun, mon і так далі).
  • command  команда, яка повинна бути виконана. В нашому випадку /home/wg/crontab/sbt.

Підсумки. Цей примітивний скрипт вирішує одночасно декілька проблем:

  • Не потрібно хвилюватись "чи зробив я бекап".
  • Економить ваш час і гроші клієнта!

Далі політ фантазій. В можете його розширити, наприклад, наші всі проекти на стадії розробки бекапляться на один сервер з усіх робочих машин.

Розкажіть нам про свій проект!