Отличный скрипт для получения обзорной информации на тему "Что такое bash-скрипты в принципе"

Этот текст был взят отсюда.
Довольно пристальные поиски ФИО или хотя бы ника автора на его сайте ничего не дали, поэтому мы просто помещаем сюда ссылку на оригинальный источник в соответствии с его требованием.

Цитата:

Для того, чтоб понять как создать скрипт бекапа, предлагаю рассмотреть самый примитивный скрипт, который работает на принципе «Что бекапим, куда сохраняем, как долго храним».

1. #!/bin/bash

2. #backup.sh

3. timestamp=`date “+%Y-%m-%d-%H-%M”`

4. backupFS=”/etc /var/lib/mysql /usr/local/etc”

5. backupTO=/var/backup5

6. KeepTime=7

7. if [ -d $backupTO ]; then

8. find $backupTO -maxdepth 1 -name \*.tar.gz -mtime +${KeepTime} -exec rm -f {} \;

9. for i in $backupFS

10. do

11. j=`expr ${i//\//-}`

12. tar -zcvf $backupTO/`hostname`.${timestamp}.${j}.tar.gz $i

13. echo “$i is done”

14. done

15. else

16. echo “backup directory is missing...exiting”

17. exit 1

18. fi

Выполняем команду chmod +x <имя этого скрипта>, другими словами делаем его исполняемым.
В рабочем скрипте цифр быть не должно. Я добавил их для удобства объяснения строк кода.

1. Любой скрипт в Linux начинается с этой последовательности, которая называется sha-bang. По сути исполняемый файл может быть просто перечислением набора команд, но если планируется что-то сложнее, где предстоит работа с переменными то sha-bang стоит поместить в файл. В этом случае будет создан процесс, в котором мы можем хранить временные данные;
2. Все строки в файле начинающиеся с символа #, кроме первой строки – комментарии. Здесь я просто указал название нашего скрипта как многие делают;
3. В переменную timestamp мы сохраняем результат выполнения команды date в нужном нам формате: год-месяц-день-час-минута. Значение переменной будет фигурировать в конечном имени файла;
4. В переменной backupFS мы будем сохранять список каталогов для бекапа. Каталоги указываем через пробел а весь их список берем в двойные кавычки;
5. Переменная backupTO содержит каталог, куда мы будем делать бекапы;
6. В переменной KeepTime мы храним срок хранения бекапов. Файлы старше 7 дней мы будем удалять. Место на диске все таки не резиновое;
7. В дело вступает команда test. Прежде чем продолжить дальше имеет смысл проверить существование backup-каталога. Иначе нет смысла продолжать. В скрипте мы не будем его создавать – пусть администратор сам управляет своей файловой системой;
8. Перед созданием бекапа мы просматриваем backup-каталог и удаляем файлы которые хранятся более 7 дней. Для вычисления сколько архив находится в файловой системе мы использовали атрибут файла mtime. В этом атрибуте сохраняется время последней модификации файла;
9. Начинаем цикл for и последовательно для каждого каталога в переменной backupFS сделаем ряд действий;
10. Начинаем новую итерацию цикла for;
11. В переменную j мы сохраняем результат выполнения регулярного выражения. Нам необходимо удалить символ “/” из путей каталогов в переменной i. Так как создать tar.gz-архив с “/” в имени файла у нас не получится;
12. Архивируем нужную нам директорию. Имя файла мы генерируем динамически. В имени будет использован результат выполнения команды hostname, То есть мы подставим имя нашего сервера, что весьма полезно при хранение бекапов в централизованном месте, где могут быть бекапыс десятка серверов. Далее в название файла добавляем текущее время в соответствие с форматом переменной timestamp. После добавления времени добавляем название резервируемого каталога с заменой символов “/” на “-”;
13. Выводим сообщение, что архивация директории завершена. Впрочем для скрипта висящего в cron в этом нет необходимости;
14. Завершение итерации цикла for;
15. Это условие выполняется если backup-каталог отсутствует в файловой системе;
16. Выводим сообщение “backup-каталог отсутствует”;
17. Выходим из скрипта с ошибкой (код 1). Польза от этого есть когда это анализируется каким-то другим процессом. Но в целях правописания мы это добавим;
18. Завершение условного оператора и выход из программы.

В соответствие со своими нуждами поправьте список каталогов для бекапа, путь куда их сохранять и количество дней хранения копий. Помещаем скрипт в cron администратора, например на 4 часа утра каждый рабочий день, еще мы добавим и субботу, чтобы захватить данные которые были сделаны в
течение рабочего дня пятницы:

0 4 * * 1-6 /root/backup.sh

Каталог для бекапа может быть NFS-ресурсом экспортированным на сервер. Так мы простым скриптом решаем важную задачу системного администрирования. Для более сложной инфраструктуры скорее всего
понадобится что-то более функциональное и гибкое.
В своих backup-скриптах больше внимания уделяйте обходу потенциальных ошибок и неадекватного поведения в случае отсутствия места на диске или в случае отсутствия нужных каталогов. Не тратьте время на оптимизацию, смысла в этом не много, ведь узким местом всегда будет процесс копирования/архивирования ваших данных.

Конец цитаты.

Цены Linux Exp Group на разворачивание системы резервного копирования в гетерогенной сети (и на прочие услуги)

Назад на страницу "Создание скрипта"
Назад на страницу "Запуск скрипта"
Назад на страницу "Проблемы при запуске скрипта"