• Быстрый переход
  • Рубрики
  • Свежие записи
  • Метки
  • Архивы
  • Реклама 1
  • Реклама 2
  • Рейтинг@Mail.ru

    Самописный скрипт использующий атрибут mtime файлов


    Сделаем простую реализацию бекапа.

    #!/bin/bash
    #backup.sh
    timestamp=`date “+%Y-%m-%d-%H-%M”`
    backupFS=”/etc /var/lib/mysql /usr/local/etc”
    backupTO=/var/backup
    KeepTime=7
    if [ -d $backupTO ]; then
    fi nd $backupTO -maxdepth 1 -name \*.tar.gz -mtime +${KeepTime} -exec rm -f {} \;
    for i in $backupFS
    do
    j=`expr ${i//\//-}`
    tar -zcvf $backupTO/`hostname`.${timestamp}.${j}.tar.gz $i
    echo “$i is done”
    done
    else
    echo “backup directory is missing...exiting”
    exit 1
    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-скриптах больше внимания уделяйте обходу потенциальных ошибок и неадекватного поведения в случае отсутствия места на диске или в случае отсутствия нужных каталогов. Не тратьте время на оптимизацию, смысла в этом не много, ведь узким местом всегда будет процесс копирования/архивирования ваших данных.

    Автор: admin, 7 мая 2010
    Рубрики: OS Linux, Новости
    Метки: , , ,

    Написать комментарий

    Последние статьи