HDBox2_by_musett.png Я уже давно хотел выложить скрипт для бэкапа, но всё ленился. Очередной пост на Хабре всё таки мотивировал меня это сделать. После чего почти два месяца черновик дожидался оформления %)

01. Вступление

02. Скрипт

03. Использование скрипта

.. 03#A. Запуск по Cron’у

.. 03#B. Ручной запуск

.. 03#C. Заметки по использованию скрипта

.. 03#D. Про списки файлов и БД используемые в скрипте

04. Получаемая информации в консоле

05. Разворачивание бекапов

06. Заметки по коду

.. 06#A. Немного об –after-date в Tar

.. 06#B. Пробелы в циклах for

.. 06#С. Подстановка параметров и команд

.. 06#D. Проверка переменной в if с помощью egrep


01. Вступление

Изначально скрипт был простенький и их было два, что неприемлемо, поэтому немного посидев на днях, я их объединил и немного перепилил код, оптимизации и всё такое.

Итак, сначала вкратце механизм работы:
Скрипт бэкапит Tar’ом базы MySQL, дампы ejabberd и файлы указанные в списках. По Воскресеньям производится полный бэкап всех указанных файлов и записывается дата&время в файл lasttimebackup.log, с Понедельника по Субботу происходит инкрементальное бэкапирование файлов по дате модификации, т.е. все файлы, у которых дата модификации новее чем дата последнего полного бэкапа – будут включены в архив. Собственно и всё.
Есть возможность задать самому какой тип архива сделать – Полный или Частичный/Инкрементальный.

Да, такой метод может подойти не всем, если например раздел примонтирован с параметрами, которые отключают обновление время модификации файлов. В принципе, тогда можно переписать скрипт с ключом -g для Tar, например.
Лично мне не подошёл метод с использованием ключа -g потому, что он делает некие слепки, с которыми уже нельзя так просто работать как с архивом.


Кто-то может также сказать, что есть готовые решения для создания бэкапов – никто не спорит, но мне было, прежде всего, интересно написать свой скрипт, который на данный момент удовлетворяет моим требованиям и прозрачен для меня.

вернуться к Содержанию

02. Скрипт

Собственно сам скрипт 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 ##

вернуться к Содержанию

03. Использование скрипта

03#A. Запуск по Cron’у

Добавляем скрипт в 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].

вернуться к Содержанию

03#B. Ручной запуск

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

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, чтобы иметь возможность посмотреть какие файлы и как обработались;

вернуться к Содержанию

05. Разворачивание бекапов

Немного об распаковке файлов:
Допустим нам надо распаковать архив 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. Заметки по коду

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’ом, зато можно использовать время модификации конкретного файла – чем я и воспользовался.

вернуться к Содержанию

06#B. Пробелы в циклах For

В принципе, конечно, можно было и эти операции с 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!