Настроить автоматический бэкап файла с использованием cron

Обновлено: 04.07.2024

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

Согласитесь, делать каждый день бэкапы проектов, не слишком интересная работа. Или если у вас несколько рабочих машин и на всех нужно делать копии актуальных проектов.

SVN поговорим позже :).

Итак, сегодня создадим скрипт на bash и добавим выполнения скрипта по cron.

Задачи:

Написать скрипт на BASH, который будет создавать резервные копии проекта вместе с БД. Запустить его на исполнение в cron.

Для этого нам нужно:

Создать файл: touch /home/wg/sb

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

Думаю, что комментировать его не нужно, так как все понятно. Переменные $1,$2 будут передаваться компндой по крону.

Сделаем наш скрипт виконуємим:

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

Создадим каталог и файл наших задач:

Поместим следующий текст в файл sbt

Где project.loc - название хоста в на локальном сервере, db_name - название БД Запускаем скрипт от root Используем следующие команды:

Осталось проверить прибавилось задание в cron командой:

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

Описание настроек по crontab

каждая строка в файле /etc/crontab имеет следующий формат:

  • 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.

Итоги. Этот примитивный скрипт решает одновременно несколько проблем:

  • Не нужно волноваться "или я сделал бэкап".
  • Экономит ваше время и клиента деньги!

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

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

Рассмотрим пример записи:

Эта строка будет архивировать директорию /var/www, где в большинстве конфигураций размещены все данные сайтов, и создавать архив в /root/backups. Команда будет выполняться по понедельникам в 2:30. Однако у данного метода создания резервных копий данных сайта есть существенный минус: бекапы будут создаваться до тех пор, пока на ВПС не закончится место на жестком диске. Для решения данной проблемы необходимо написать скрипт, который позволит сохранять не более 4-х копий архивов.

Бекап данных сайтов

Итак, для запуска бекапа данных сайта заходим на ВПС с помощью SFTP от имени root пользователя. В рабочей директории (/root) создаем папку ./backup/www-backup в которой будут расположены резервные копии. В папке /root/backup создаем скрипт, который будет запускать планировщик cron для создания резервных копий. Создаем новый файл, называем его www-backup.sh , открываем текстовым редактором и записываем в него сам код скрипта:

Обратите внимание, что в конце скрипта необходимо наличие отступа.

Либо качаем готовый скрипт www-backup.sh ОТСЮДА и заливаем в /root/backup.
Данный скрипт позволяет нам создать резервные копии данных сайта и хранить 4 версии бекапа, однако он не архивирует базы данных.

Бекап баз данных

Для архивации Базы Данных создаем файлик mysql-backup.sh в директории /root/backup . В данном файле размещаем следующий скрипт:

Обратите внимание, что в конце скрипта необходимо наличие отступа.

Также можно скачать готовый скрипт mysql-backup.sh ОТСЮДА и залить в /root/backup.
Обратите внимание, что необходимо заменить yoursqlpassword на Ваш root пароль для доступа к БД.

Результат создания скриптов

Создание 2-х различных скриптов для бекапа сайтов и баз данных дает нам возможность запускать данные скрипты в различные интервалы времени. То есть, если обычно достаточно создавать резервные копии сайта раз в неделю, то базы данных желательно архивировать ежедневно.
После того, как в директории /root/backup созданы скрипты для создания бэкапов базы данных и файлов сайта (www-backup.sh и mysql-backup.sh) мы добавляем задание на архивацию в crontab-файл. Открываем /etc/crontab и дописываем следующие строчки:

Данная статья расскажет как создать бэкап сайта и поможет настроить планировщик задач (cron) таким образом, чтобы он создавал резервные копии баз данных и данных Вашего сайта. А также сделаем возможность выгрузки бекапа на FTP.

Бэкап баз данных

Для того чтобы сделать бэкап базы данных достаточно запустить в командной строке:

Вместо user нужно вписать имя пользователя, password - пароль, database - имя базы данных, и вписать нужный путь и название файла для сохранения. Даная команда выгрузить только указаную БД и сохранит файл в указаную директорию без сжатия файла (в формате sql)

Для того чтобы выгрузить все БД указаного пользователя нужно вместо название БД написать опцию --all-databases :

Если же нужно сжать sql файл в архив gzip:

Бэкап данных сайтов

Для бэкапа сайта нужно запустить в той же консоли такую команду:

Таким образом создастся архив gzip c данными Вашего сайта. Не забудьте заменить путь к бэкапу и сайту на свои директории предварительно создав их.

Автоматизация

Таким образом мы рассмотрели как можно сделать бэкапы Вашего сайта и БД, но вручную каждый раз запускать архивацию сайта неудобно, поэтому нужно добавить эти команды в планировщик задач.

Это можно сделать двумя способами:

Первый - самый простой, добавить обе команды непосредственно в cron. Это можно сделать или в Панели Управления сайтом, или же вручную в консоли:

и задать расписание по которому запускать скрипты, например:

Второй способ - это создать скрипт с нужными нам командами и уже потом этот скрипт добавлять в cron.

Создаем файл /path/to/script/backup.sh:

Обратите внимание, что в конце скрипта необходимо наличие отступа.

Добавляем скрипт в cron:

Выгрузка на FTP

Часто появляется необходимость не только сделать бэкап сайта но и выгрузить его на сторонный FTP. Реализовать данную возможность поможет команда:

Данная команда выгружает на FTP только указаный файл. Если нужно выгрузить сразу несколько файлов или все файлы *.gz из директории:

Окончательный скрипт будет выглядеть таким образом:

Незабудьте только указать параметры пользователя к доступу на FTP и БД, адрес FTP сервера и путь для хранения бэкапов на сервере.


Мануал

Всегда рекомендуется делать резервные копии важных данных (документов, изображений, музыки и т. д.),

Резервная копия должна храниться на флэш-накопителе USB.

Но я также хотел сохранить удаленные файлы на пару дней, в случае случайного удаления файлов.

Есть много способов выполнить эту задачу, но я решил использовать для этой цели rsync и cronjob.

Оба инструмента делают процесс резервного копирования очень гибким.

Очень легко управлять временем процесса резервного копирования cronjobs, а rsync упрощает изменение адресата (например, другой папки, устройства или удаленного хоста).

Моя идея состояла в том, чтобы добавить cronjob, чтобы запустить скрипт bash, который использует rsync для копирования каталогов и файлов на флешку.

Но имена устройств флеш-накопителей меняются, если вы подключаете их в другом порядке.

Чтобы избежать этой проблемы, я добавил правило udev для создания символической ссылки каждый раз, когда флешка подключена.

Добавьте правило udev для создания символической ссылки

Прежде всего, нужно было выяснить имя устройства флеш-накопителя.

Поэтому я подключил его и посмотрел на разделы:

Эти две строки были наиболее интересными из результатов:

Но мне нужно было больше информации (идентификатор продавца, идентификатор продукта и серийный номер) флеш-накопителя, чтобы добавить правило udev. я использовал

чтобы получить подробную информацию обо всех устройствах USB, которые подключены.

Вот выдержка из вывода со всей необходимой мне информацией:

Правила udev находятся в /etc/udev/rules.d и имеют «специальное» имя файла.

Все правила udev обрабатываются в лексическом порядке, т. е. вы можете установить порядок правил udev с префиксом правила.

Содержимое файлов правил udev является ключевыми, парами значений, и для этой цели наиболее важными являются KERNEL и ATTR.

Значение KERNEL сопоставляется с именем устройства ядра, а значения ATTR сопоставляются с атрибутами устройства (я не хочу вдаваться в подробности).

Вам необходимо перезагрузить правила udev или перезапустить демон udev, чтобы «активировать» правило udev.

В моем случае (Slackware Linux) я использовал:

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

В Arch Linux вам не нужно перезагружать демон udev, он автоматически обнаруживает изменения.

Просто подключите USB-накопитель снова, и символическая ссылка должна быть доступна.

Скрипт резервного копирования

Следующий скрипт отражает данные каталоги в BACKUP_FOLDERS на флеш-накопитель, то есть если вы удалите файл в исходном каталоге, он также будет удален на флеш-накопителе, и восстановить эти файлы не удастся.

Это хороший вариант, поскольку зеркальная папка на флеш-накопителе будет обновлена, и все удаленные файлы будут сохранены в другом каталоге.

Я использовал переменную DELFILES для определения папки всех удаленных файлов.

Я также хотел знать, был ли процесс резервного копирования успешным или произошла ошибка.

Настройка задания cron

Читайте также: