Я уже давно хотел выложить скрипт для бэкапа, но всё ленился. Очередной пост на Хабре всё таки мотивировал меня это сделать. После чего почти два месяца черновик дожидался оформления %)
.. 03#C. Заметки по использованию скрипта
.. 03#D. Про списки файлов и БД используемые в скрипте
04. Получаемая информации в консоле
.. 06#A. Немного об –after-date в Tar
.. 06#С. Подстановка параметров и команд
.. 06#D. Проверка переменной в if с помощью egrep
Изначально скрипт был простенький и их было два, что неприемлемо, поэтому немного посидев на днях, я их объединил и немного перепилил код, оптимизации и всё такое.
Итак, сначала вкратце механизм работы:
Скрипт бэкапит Tar’ом базы MySQL, дампы ejabberd и файлы указанные в списках. По Воскресеньям производится полный бэкап всех указанных файлов и записывается дата&время в файл lasttimebackup.log, с Понедельника по Субботу происходит инкрементальное бэкапирование файлов по дате модификации, т.е. все файлы, у которых дата модификации новее чем дата последнего полного бэкапа – будут включены в архив. Собственно и всё.
Есть возможность задать самому какой тип архива сделать – Полный или Частичный/Инкрементальный.
Да, такой метод может подойти не всем, если например раздел примонтирован с параметрами, которые отключают обновление время модификации файлов. В принципе, тогда можно переписать скрипт с ключом -g для Tar, например.
Лично мне не подошёл метод с использованием ключа -g потому, что он делает некие слепки, с которыми уже нельзя так просто работать как с архивом.
Кто-то может также сказать, что есть готовые решения для создания бэкапов – никто не спорит, но мне было, прежде всего, интересно написать свой скрипт, который на данный момент удовлетворяет моим требованиям и прозрачен для меня.
Собственно сам скрипт VPSbackup.LeoN.V07.sh, а после будут комментарии и выкладки по коду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #!/bin/bash # Author: LeoN @ka Children of koRn # www.muscari.icarrot.rocks / XMPP: ChildrenofkoRn@muscari.icarrot.rocks # iLAB – Time to fly # переменные: VERSION='Version V07 of 2011.04.28 07:03 PM' # метка с датой и временем, используетя в именах: FDATE=$(date +%F_%H-%M) # директория куда сохраняются бекапы: SAVEDIR='/root/VPSbackups' # файл с временной меткой последнего полного бекапа, # время модификации этого файла Tar использует для инкрементального бэкапа: LAST="${SAVEDIR}/lasttimebackup.log" # файл со списком баз данных MySQL, которые надо бекапить: DBS=$(cat ${SAVEDIR}/databaseslist.txt) # mysqldump с рутовым паролем от MySQL для экспорта баз: SQLDUMP='mysqldump -uroot -pParanoidPASS' # темповая директория для экспорта баз перед архивированием: EXPORTDB="${SAVEDIR}/everyday/DBSexport_${FDATE}" # список файлов/директорий, которые необходимо архивировать: INTAR="${SAVEDIR}/tar.includelist.txt" # список файлов/директорий, которые необходимо исключить из архива: EXTAR="${SAVEDIR}/tar.excludelist.txt" # echo '\n'"$(date +'%R:%S'): Start script VPSbackup, ${VERSION};"'\n' # получаем день недели: # условие создано для реализации ручного выбора типа бэкапа путём вызова скрипта с аргументом, # пример вызова: sh /root/backup_vps.sh $1 # где $1 число: от 1 до 6 - инкрементальный бэкап, 7 - полный бэкап; # если аргумент не указан [например, когда скрипт автоматически запускается по cron], то день недели берётся из даты на сервере: if echo "$1" | egrep '^[+]?[1-7]$' >/dev/null ; then WDAY=$1 else WDAY=$(date +%u) fi # создаём темповую директорию для экспорта баз: mkdir $EXPORTDB 2> /dev/null # для директорий, которые бекапить нет нужды, но хотелось бы иметь список файлов в случае чего - делаем рекурсивный вывод ls в файл: ls -lRaF '/home/ftp/pubftp/' > "${EXPORTDB}/pubftp_list_${FDATE}.txt" ls -lRaF '/home/leon/files/' > "${EXPORTDB}/files_list_${FDATE}.txt" echo "$(date +'%R:%S'): begining dump databases.."'\n' # дампим ejabberd: /sbin/ejabberdctl dump /ejabberd_backups/ejabberd_${FDATE}.dump /sbin/ejabberdctl backup /ejabberd_backups/ejabberd_${FDATE}.backup # дампим базы MySQL, цикл обрабатывает по порядку базы в списке из переменной DBS, до тех пор пока список не закончится: for dbname in $DBS; do $SQLDUMP $dbname > "${EXPORTDB}/${dbname}_${FDATE}.sql" done echo "$(date +'%R:%S'): dump databases extracted;"'\n' # условие которое проверяет какой день недели сегодня [в WDAY записан числовой эквиваленнт дня недели [1 -7], где 1 - понедельник], # если WDAY != 7, то выполняется блок Then: в переменную TARPAR записываются опции для инкрементального бекапа Tar'ом по дате модификации файла LAST, # если сегодня воскресенье, т.е. WDAY=7, то выполняется блок Else: в переменную TARPAR записываются опции для полного бекапа Tar'ом и обновляется время модификации файла LAST; # также в обоих блоках генерируется имя бекапа и лог-файла для Tar'a в переменную SAVENAME. if [ "$WDAY" -ne 7 ]; then SAVENAME="${SAVEDIR}/VPSbackup_${FDATE}.SMALL" TARPAR="-N$LAST -X$EXTAR -T$INTAR $EXPORTDB" # перестраховка, если случайно время модификации у контрольного файла было изменено [например открыли файл и нажали сохранить, хотя изменений и не вносили], # получаем _из_ файла LAST штамп времени и устаналиваем его как время модификации _для_ этого же файла: touch -t $(cat $LAST) $LAST else SAVENAME="${SAVEDIR}/VPSbackup_${FDATE}.FULL" TARPAR="-X$EXTAR -T$INTAR $EXPORTDB" echo $(date +%Y%m%d%H%M.%S) > $LAST fi # вывод в консоль полученных переменных, для мониторинга при ручном прогоне: echo "##### prefix-list in script: #####" echo "#day of week $WDAY #date $FDATE #last Full backup $(cat $LAST)"'\n' echo "#databases list:"'\n'"$(ls $EXPORTDB)"'\n' echo "#savename: ${SAVENAME}"'\n''\n'"#Tar's parameters: ${TARPAR}"'\n''########## end list ##########''\n' echo "$(date +'%R:%S'): beginning of filtration and packaging backup files .. wait a few moments .."'\n' # тут всё просто, происходит архивирование, Tar получает опции из переменной TARPAR, а имя для архива и лога из SAVENAME: tar czvf ${SAVENAME}.tar.gz $TARPAR > ${SAVENAME}.log 2>&1 # добавляем в лог Tar'a текущий временной штамп, себе для справки: echo $(cat $LAST) >> ${SAVENAME}.log # удаление временных файлов и директорий [куда дампились бд и т.п.]: rm -rf $EXPORTDB /ejabberd_backups/* echo "$(date +'%R:%S'): packing is completed, all operations were successful."'\n''\n'"backup location >> ${SAVENAME}.tar.gz"'\n' # завершение работы скрипта; exit 0 |
Как видите сам скрипт изначально сопровождается комментариями, поэтому некоторые вопросы должны отпасть.
Download VPSbackup.sh by LeoN version V07 of 2011.04.28 07:03 PM
## скрипт тестировался на Ubuntu Lucid Lynx ##
Добавляем скрипт в cron от рута, лучше выбрать время с минимальной нагрузкой на сервер, обычно это ранее утро:
1 | crontab -e -u root |
добавляем строку с нашим скриптом:
1 2 3 4 5 | # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.rZGi9T/crontab installed on Thu Apr 14 02:57:01 2011) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) # m h dom mon dow command 25 4 * * 1-7 sh /root/VPSbackups/VPSbackup.LeoN.V07.sh |
Т.е. каждый день в 4:25 утра.
Если вы хотите чтобы полный бэкап делался не в воскресенье, а например в субботу, то нужно изменить 55 строчку скрипта:
1 2 3 | if [ "$WDAY" -ne 7 ]; изменить на if [ "$WDAY" -ne 6 ]; |
т.е. 6 день недели – суббота.
Когда скрипт работает по крону, то сообщения о работе сохраняются в /var/mail/root и можно в случае чего посмотреть.
Если вы не хотите чтобы сообщения скрипта падали в /var/mail/root вы можете их перенаправить, отредактирован cron следующим образом:
1 2 3 | ... # m h dom mon dow command 25 4 * * 1-7 sh /root/VPSbackups/VPSbackup.LeoN.V07.sh >> /root/VPSbackups/backups.log 2>&1 |
– Так все сообщения при запуске скрипта от крона будут сохраняться в /root/VPSbackups/backups.log, т.е. в отдельный лог.
1 2 3 | ... # m h dom mon dow command 25 4 * * 1-7 sh /root/VPSbackups/VPSbackup.LeoN.V07.sh 1> /dev/null |
– А так сообщения скрипта будут уходить в никуда, в /var/mail/root могут свалится только ошибки скрипта [не Tar’a].
Также я упоминал, что при ручном прогоне можно самому указать какой тип бэкапа сделать полный или частичный:
1 | sh /root/VPSbackups/VPSbackup.LeoN.V07.sh |
так скрипт сам выбирает какой тип бэкапа делать, на основе установленной даты на сервере и 55 строки;
1 | sh /root/VPSbackups/VPSbackup.LeoN.V07.sh 3 |
так вы задаёте скрипту день недели сами через аргумент, можно указывать положительные числа от 1 до 7, если 7 то происходит полный бэкап.
Если вы укажете что-то другое в аргументе [букву, отрицательное число и т.д.], то он проигнорирует ваш аргумент и возмёт день недели из даты на сервере.
03#C. Заметки по использованию скрипта
В строчках 44-45 путь к ejabberdctl у вас может отличаться, его можно узнать следующей командой:
1 2 | root@muscari.icarrot.rocks: which ejabberdctl /sbin/ejabberdctl |
Если у вас не стоит ejabberd то строки 44-45 нужно закомментировать либо удалить.
А также изменить 78 строчку:
1 2 3 | rm -rf $EXPORTDB /ejabberd_backups/* изменить на: rm -rf $EXPORTDB |
Строчки 40-41 выводят рекурсивный листенинг указанных каталогов, мне нет смысла их бекапить, так как все файлы есть локально, но знать какие именно там файлы были бывает полезно.
Опять же, если у вас нет такой необходимости, то эти строчки закомментируйте либо удалите.
Заметка: Почему ls не обернул в for – 06#B. Пробелы в циклах For.
03#D. Про списки файлов и БД используемые в скрипте
Что ещё добавить по работе скрипта..
1 2 3 4 5 6 | если SAVEDIR='/root/VPSbackups' а EXTAR="${SAVEDIR}/tar.excludelist.txt" то в итоге: EXTAR=/root/VPSbackups/tar.excludelist.txt |
думаю это понятно, если у вас файлы-списки для скрипта разбросаны, то можно указать просто полный/абсолютный путь до файла, например:
1 | EXTAR='/home/username/somedir/tar.excludelist.txt' |
сам файл tar.excludelist.txt такого вида:
1 2 3 | /home/username/files/media /home/leon/logs /home/username/somedir |
причем есть небольшой ньюанс именно со списком исключений в tar.excludelist.txt:
1 2 3 4 5 6 | так каталог media будет полностью исключён из архива: /home/username/files/media так только файлы/директории из каталога media будут исключены из архива, но сам каталог в архиве будет, хоть и пустой: /home/username/files/media/* а так весь каталог media с его содержимым будет архивирован, т.е. это не верный формат записи в tar.excludelist.txt /home/username/files/media/ |
С файлом tar.includelist.txt всё проще, просто список файлов и директорий которые нужно бэкапить:
1 2 3 4 5 6 7 8 | /ejabberd_backups/ /home/robots /home/leon /etc/ /root/VPSbackups/databaseslist.txt /root/VPSbackups/tar.includelist.txt /root/VPSbackups/tar.excludelist.txt /root/VPSbackups/VPSbackup.LeoN.V07.sh |
Тут не важно если в самом конце пути у директории слэш или нет.
Файл databaseslist.txt со списком баз данных должен иметь содержимое такого вида:
1 2 3 4 5 6 7 8 9 10 11 | leon_wp atarity_bg atarity_wp keyring_phpbb ion_cats ion_com ion_restaurant lovenature_ls xmpp_ilabme xmpp_jabbosorg xmpp_yukimori |
Вы должны убедиться что все файлы и директории, которые используются в начале скрипта в разделе “# переменные:” у вас созданы и имеют необходимые права.
04. Получаемая информации в консоле
Вот так выглядит вывод в консоль при ручном прогоне:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | root@ilab:~# sh /root/VPSbackups/VPSbackup.LeoN.V07.sh 1 02:45:53: Start script VPSbackup, Version V07 of 2011.04.28 07:03 PM; 02:46:54: begining dump databases.. 02:47:21: dump databases extracted; ##### prefix-list in script: ##### #day of week 1 #date 2011-05-01_02-45 #last Full backup 201104240505.01 #databases list: leon_wp_2011-05-01_02-45.sql filelist_2011-05-01_02-45.txt atarity_bg_2011-05-01_02-45.sql atarity_wp_2011-05-01_02-45.sql keyring_phpbb_2011-05-01_02-45.sql ion_cats_2011-05-01_02-45.sql ion_com_2011-05-01_02-45.sql ion_restaurant_2011-05-01_02-45.sql lovenature_ls_2011-05-01_02-45.sql pubftp_list_2011-05-01_02-45.txt xmpp_ilabme_2011-05-01_02-45.sql xmpp_jabbosorg_2011-05-01_02-45.sql xmpp_yukimori_2011-05-01_02-45.sql #savename: /root/VPSbackups/VPSbackup_2011-05-01_02-45.SMALL #Tar's parameters: -N/root/VPSbackups/lasttimebackup.log -X/root/VPSbackups/tar.excludelist.txt -T/root/VPSbackups/tar.includelist.txt /root/VPSbackups/everyday/DBSexport_2011-05-01_02-45 ########## end list ########## 02:47:21: beginning of filtration and packaging backup files .. wait a few moments .. 02:48:21: packing is completed, all operations were successful. backup location >> /root/VPSbackups/VPSbackup_2011-05-01_02-45.SMALL.tar.gz root@ilab:~# |
Что же мы тут видим?
Версию скрипта – это понятно, далее сообщение об начале экспорта баз и завершении, после:
1 | #day of week 1 #date 2011-05-01_02-45 #last Full backup 201104240505.01 |
где:
1 2 3 4 5 | #day of week 1 - Текущий день недели либо тот, который вы задали [в данном случае я указал 1], от 1 до 7, где 1 - понедельник, а когда 7, т.е. воскресенье, то происходит полный бэкап. #date 2011-05-01_02-45 - дата&время, будет использоваться в именах экспортированных баз данных и самого архива с логом. #last Full backup 201104240505.01 - ну и дата&время последнего полного бэкапа, если запущен полный бэкап, то временная метка будет уже обновленная и вы увидите текущее время. |
Далее идёт список имён уже экспортированных бд и файлов с листенингом нужных каталогов, после путь с именем для архива и лог-файла Tar’a, из которого понятно какой тип архивирования выбран SMALL – частичный или FULL – полный.
Потом идёт строка с параметрами, которая передаётся Tar’у:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Tar\'s parameters: -N/root/VPSbackups/lasttimebackup.log -X/root/VPSbackups/tar.excludelist.txt -T/root/VPSbackups/tar.includelist.txt /root/VPSbackups/everyday/DBSexport_2011-05-01_02-45 # давайте разберём эту строку: # -X указывает на файл со списком файлов, которые нужно исключить из архивирования: -X/root/VPSbackups/tar.excludelist.txt # -X более короткая форма "--exclude-from=", тоже самое что и: --exclude-from=/root/VPSbackups/tar.excludelist.txt # # -T указывает на файл со списком файлов, которые нужно архивировать: -T/root/VPSbackups/tar.includelist.txt # -T более короткая форма "--files-from=", тоже самое что и: --files-from=/root/VPSbackups/tar.includelist.txt # # -N передаётся временная метка, файлы с датой модификацией новее этой метки будут архивированы, в данном случае указывается файл и именно его время модификации будет использоваться как временная метка: -N/root/VPSbackups/lasttimebackup.log # -N более короткая форма "--after-date=", тоже самое что и: --after-date=/root/VPSbackups/lasttimebackup.log # # ну а /root/VPSbackups/everyday/DBSexport_2011-05-01_02-45 просто директория с экспортированными ДБ, которая будет включена в архив. # |
Заметка: “Немного об –after-date” вынес в 06#A. Немного об –after-date в Tar.
Потом идёт уведомление, что начинается архивирование и заканчивается.
Также выводится время перед основными действиями, опять же для удобства, чтобы можно было отследить сколько та или иная операции заняла времени.
Ну и в конце выводится путь куда был сохранён архив и под каким именем.
На выходе мы получаем два файла:
root/VPSbackups/VPSbackup_2011-05-01_02-45.SMALL.tar.gz – сам архив;
root/VPSbackups/VPSbackup_2011-05-01_02-45.SMALL.log – лог Tar’a, чтобы иметь возможность посмотреть какие файлы и как обработались;
Немного об распаковке файлов:
Допустим нам надо распаковать архив VPSbackup_2011-04-30_04-05.SMALL.tar.gz
1 2 3 4 5 6 | # переходим в директорию с архивами: cd /root/VPSbackups/ # перед распаковкой лучше создать папку куда будем распакоывать и потмо её указать Tar'у: mkdir VPSbackup_2011-04-30_04-05 # распаковываем архив: tar xf VPSbackup_2011-04-29_04-05.SMALL.tar.gz -C 'VPSbackup_2011-04-30_04-05' |
В результате мы получим диреторию /root/VPSbackups/VPSbackup_2011-04-30_04-05/ а в ней будут все распакованные каталоги и файлы, структура каталогов будет относительно корня.
Другой пример: нам нужно получить полную версию бэкапа за прошлый четверг, имеем такой список архивов:
1 2 3 4 5 6 | VPSbackup_2011-04-24_04-05.FULL.tar.gz VPSbackup_2011-04-25_04-05.SMALL.tar.gz VPSbackup_2011-04-26_04-05.SMALL.tar.gz VPSbackup_2011-04-27_04-05.SMALL.tar.gz VPSbackup_2011-04-28_04-05.SMALL.tar.gz VPSbackup_2011-04-29_04-05.SMALL.tar.gz |
берём последний полный бэкап, который был перед четвергом это у нас 2011-04-24 и частичный за четверг 2011-04-28,
1 2 3 4 5 6 | # перейдём в каталог с архивами и создадим темп директорию, куда будет распаковывать, можно обьединить эти два действия: cd /root/VPSbackups/ && mkdir VPSbackup_2011-04-24_28 # сначала распаковываем полный бекап: tar xf VPSbackup_2011-04-24_04-05.FULL.tar.gz -C 'VPSbackup_2011-04-24_28' # а сверху, туда же, распаковываем частичный за четверг, он автоматически перезапишет нужные файлы на новые: tar xf VPSbackup_2011-04-28_04-05.SMALL.tar.gz -C 'VPSbackup_2011-04-24_28' |
В результате получим в каталоге /root/VPSbackups/VPSbackup_2011-04-24_28/ полный бэкап для четверга.
Теперь другая задача: нужно узнать если в бэкапе за 2011-04-28 число нужный нам файл.
Ну распаковать и посмотреть это понятно, самое простое.
Логично выполнить сначала поиск файла по лог-файлу Tar’a:
1 | grep 'php.ini' VPSbackup_2011-04-28_04-05.SMALL.log | grep -v "file is unchanged" |
если в консоль ничего не вывелось, то файла “php.ini” в этом архиве нет.
Также можно распарсить архив Tar’ом и grep:
1 | tar -tf VPSbackup_2011-04-28_04-05.SMALL.tar.gz | grep 'php.ini' |
если в консоль ничего не вывелось, то файла “php.ini” в этом архиве нет.
Кстати такой подход ресурсоёмкий, в отличие от поиска по логу.
при надобности можно сохранить вывод в файл:
1 | tar -tf VPSbackup_2011-04-28_04-05.SMALL.tar.gz | grep 'php.ini' > filelist_tar.txt |
Ну и на десерт извлечение нужного файла, а не всего архива:
1 | tar xf VPSbackup_2011-04-28_04-05.SMALL.tar.gz '/home/userX/my docs/pdf/' '/home/userX/data/image/weather4n.png' |
так распакуется только указанный каталог и файл, к сожалению в данной конструкции ключ -C не срабатывает, т.е. нельзя указать куда сохранить, автоматически распаковывается в каталог рядом с архивом.
06#A. Немного об –after-date в Tar
В изначальном варианте указывалось непосредственно дата&время в формате date +’%F %R:%S’, т.е. 2011-04-24 04:24:24
Но выявился неприятный баг, если Tar’у передавать строку с “-N2011-04-24 04:24:24” и другими параметрами через одну переменную, например:
1 2 3 4 5 6 7 | # не рабочий вариант, -N отбрасывает всё, что после первого пробела: tar czvf somename.tar.gz $TARPAR > somename.log 2>&1 # где TARPAR='-N2011-04-24 04:24:24 -X/root/VPSbackups/tar.excludelist.txt -T/root/VPSbackups/tar.includelist.txt /root/VPSbackups/everyday/DBSexport_2011-05-01_02-45' # в логе Tar'a будет выглядеть так: tar: Option --after-date: Treating date `2011-04-24' as 2011-04-24 00:00:00 tar: 04\:24\:24: Cannot stat: No such file or directory |
то Tar [или bash] фэйлит и обрабатывает только дату до пробела, а время пытается обработать как каталог, который нужно архивировать.
Причём если метку даты&времени передать через свою, отдельную переменную, то всё работает, например:
1 2 3 4 5 | # рабочий вариант, -N понимает пробел: tar czvf somename.tar.gz -N"$LAST" $TARPAR > somename.log 2>&1 # где LAST='2011-04-24 04:24:24' TARPAR='-X/root/VPSbackups/tar.excludelist.txt -T/root/VPSbackups/tar.includelist.txt /root/VPSbackups/everyday/DBSexport_2011-05-01_02-45' |
К сожалению Tar не понимает другой формат даты&времени [где например отсутствую пробелы], всякие попытки экранировать дату с временем также были проигнорированы Tar’ом, зато можно использовать время модификации конкретного файла – чем я и воспользовался.
В принципе, конечно, можно было и эти операции с ls заключить в цикл for, но он плохо работает с пробелами в путях, точнее совсем не работает, получается аналогичная ситуация с Tar.
Из-за двух строк я не стал с этим заморачиваться, да и признаться в прошлый раз у меня победить пробелы так и не вышло тут.
Так что, если кто знает как решить сабж, то вэлкам (:
Так, про пробелы в циклах и про использовании “–after-date=” в Tar я уже сказал, что ещё..
06#С. Подстановка параметров и команд
Запись вида ${EXPORTDB} тоже самое что и $EXPORTDB, только более строгая форма, использовал её там где вызов переменной идёт прямо в тексте.
Запись $(date +%u) более современный вариант обратных кавычек `date +%u`для подстановки команд:
1 2 3 4 5 6 7 8 | WDAY=$(date +%u) # тоже само что и: WDAY=`date +%u` # # а запись вида: DBS=$(cat ${SAVEDIR}/databaseslist.txt) # можно было записать так: DBS=$(<${SAVEDIR}/databaseslist.txt) |
Можете прочитать об этом например тут:
http://www.linuxcookbook.ru/books/absguide/ch04s01.html
http://www.linuxcookbook.ru/books/absguide/ch04s02.html
http://www.linuxcookbook.ru/books/absguide/ch09s03.html#PARAMETER-SUBSTITUTION
http://www.linuxcookbook.ru/books/absguide/ch14.html#BACKQUOTESREF
06#D. Проверка переменной в if с помощью egrep
Остановлюсь ещё на этом условии:
1 2 3 4 5 6 | if echo "$1" | egrep '^[+]?[1-7]$' >/dev/null ; then WDAY=$1 else WDAY=$(date +%u) fi |
тут if проверяет соответствует ли содержимое переменной $1 шаблону в egrep [egrep это тот же grep с более полной поддержкой regexp], если Да – то выполняется блок Then, иначе блок Else. Ошибку egrep, в случае если значение переменной не прошло наш шаблон, мы перенаправляем в /dev/null/, такая небольшая хитрость.
Переменная $1, как вы наверно заметили, негде не объявлена, потому что в неё по умолчанию в Bash’e передаётся первый аргумент при вызове скрипта [аналогично кстати и с функциями], если будет второй аргумент, то он сохранится в $2 и т.д.
Вроде бы всё.
Вопросы/комментарии/советы – приветствуются ❗
Кстати, есть неплохой пост от NQhost на хабре – Простой способ резервного копирования Linux-сервера с выгрузкой файлов по FTP.
Интересен он прежде всего описанием возможности автономной выгрузки бэкапа на другой сервер по FTP.
На нашем сервере работает XMPP сервер Ejabberd на домене muscari.icarrot.rocks, все желающие могут присоединиться, регистрация доступна через веб – тут. Enjoy!
You can follow any responses to this entry through the RSS 2.0 feed.
Children of koRn
October 22nd, 2012 at 1:52 am
По поводу того, что в промежуточных инкрементальных архивах может быть удалённый мусор – это да.
Единственно каждую неделю этот мусор дропается, когда создаётся полный архив.
По поводу —listed-incremental, уже поздно, на днях ещё раз посмотрю и проверю всё
Volod
October 21st, 2012 at 10:55 pm
а что касается листинга инкрементнго архива все точно также и листниг
tar -tf Backup_2011-04-28_04-05.SMALL.tar.gz | grep ‘php.ini’
и извлечение конкретного файла
Сейчас только что проверил
PS Так что не могу понять в чем же вы усмотрели странность структуры инкрементного архива
PPS Предыдущий пост удалите – случайно мусор влез при копировании
Volod
October 21st, 2012 at 9:54 pm
Да нет же какие снапшоты?
Суть парамера –listed-incremental=файл_метаданных.
В следующем
1. Если указанного файла не существует – выполняется полный бэкап, а сам файл – создается и заполняется.
2. Если указанный файл существует – выполняется инкрементальный бэкап от момента, определяемого файлом, а сам файл – обновляется.
В созданый архив добавляются только те файлы что были изменены, также пишется инфа об удаленных файлах, которые при разворачиваннии бэкапа удаляются
А Ваш скрипт этот момент просто игнорирует, т.е. при разворачивании Вашего инкрементальнго бэкапа вылезут удаленные ранее файлы.
Children of koRn
October 21st, 2012 at 9:09 pm
Это snapshot’ы? В самом начале я писал, что мне не понравились они.
С архивом просто, скачал, открыл, есть файл/нету файла, а в слепках какая-то странная структура. Насколько понял, его нужно “развернуть” и только тогда получишь нужный файл.
В общем в начале статьи это упоминалось.
А цикл тут вообще для другого.
Volod
October 21st, 2012 at 8:48 pm
Скрипт конечно не плох, но больше как пример программирования на bash, нежели как скрипт инкрементального backup
Скажите пожалуйста к чему эти пляски с бубнов с циклами и параметром –after-date ?
Ведь tar же прекрасно умеет делаеть инкрементальный бэкап cамостоятельно
tar -cvf /файл_архива /каталог_который_бекапим –listed-incremental /файл_листинга
—
Children of koRn
January 4th, 2012 at 10:38 am
В этом и дело, пихать всё это в скрипт, чтобы один раз создать это в начале, смысл?
Тем более некоторые файлы надо заполнить, например списки файлов для бекапа.
В lasttimebackup.log ничего ложить не нужно, просто создать раз.
Нет, если конечно очень надо прям, могу добавить несколько строк, которые создают файлы/директории если они отсутствую.
Enzo_brn
January 2nd, 2012 at 12:50 pm
Спасибо вам добрый человек, а напильнеГ дадите?
например, надо lasttimebackup.log создать и положить в него хоть какуюньть дату: 201201021639.03
и еще дофига директорий и файлов..
Может допилите? а то я в shell script-е 0 полный, а идея то неплоха!))) Спасибо)