Задача: Создайте задание 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
.