Назад | Перейти на главную страницу

Cronjob для отправки резервной копии MongoDB через git

Задача: Создайте задание Cronjob, которое каждую ночь выполняет сценарий bash. Сценарий bash должен выполнить резервное копирование mongoDB и отправить его в репозиторий Git.

Итак, я создал cronjob как пользователь root через crontab -e команда:

#!/bin/bash
SHELL=/bin/bash
USER=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
HOME=/root

0 2 * * * /path/script.sh > /path/script.log

Это сценарий что должно быть выполнено:

BAK="/path"

#MONGO="/usr/bin/mongo"
#MONGODUMP="/usr/bin/mongodump"
#GIT="/usr/bin/git"

echo "starting backup"
echo $BAK
/usr/bin/mongodump --username=myusername --password=mypassword --db=mydatabase --out=$BAK$
echo "backup created"
/usr/bin/git add .
/usr/bin/git commit -m "backup from `date +'%Y_%m_%d'`"
echo "committed"
/usr/bin/git push -u origin master
echo "pushed backup. done"

Результат: Резервные копии создаются, но не помещаются в репо. Выполнение сценария вручную подталкивает резервные копии по желанию. Журнал включает только все эхо из сценария.

Вам нужно сменить каталог на "$BAK" перед вводом команд git.

Вы явно записываете свои резервные копии в $BAK$ но когда вы запускаете gid add . вы будете в домашнем каталоге пользователя, выполняющего задание cron. В этом случае это будет /root.


Вот тестовый сценарий

pwd >/tmp/atest.out
touch ./atest.file

При запуске из crontab root с помощью

* * * * * /home/iain/atest

Содержимое /tmp/atest.out

/ корень

Так где же ./atest.file

ls -l /home/iain/atest.file
ls: cannot access /home/iain/atest.file: No such file or directory

Хм

ls -l /root/atest.file
-rw-r--r--. 1 root root 0 Nov 16 13:24 /root/atest.file

Бинго !. Не имеет значения, что вы запускаете скрипт из домашнего каталога git. В данном случае рабочий каталог / root.

/usr/bin/git add .

добавляет текущий рабочий каталог, который, если вы его не изменили, /root.