Задача: Создать задание Cron, которое запускает сценарий 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"
Результат : Резервные копии создаются, но не отправляются в репо. Выполнение сценария вручную подталкивает резервные копии по желанию. Журнал включает только все эхо из сценария.
Anda perlu mengubah direktori ke "$ BAK"
sebelum mengeluarkan perintah git.
Anda secara eksplisit menulis backup ke $ BAK $
tetapi ketika Anda menjalankan gid add.
Anda akan berada di direktori home dari pengguna yang menjalankan tugas cron. Dalam hal ini akan menjadi / root
.
Berikut adalah skrip uji
pwd >/tmp/atest.out
touch ./atest.file
Ketika dijalankan dari crontab root dengan
* * * * * /home/iain/atest
Isi /tmp/atest.out
/ root
Jadi di mana ./atest.file
ls -l /home/iain/atest.file
ls: cannot access /home/iain/atest.file: No such file or directory
Hmm
ls -l /root/atest.file
-rw-r--r--. 1 root root 0 Nov 16 13:24 /root/atest.file
Bingo !. Tidak masalah jika Anda menjalankan skrip dari direktori home git. Direktori kerja dalam hal ini adalah / root.
/usr/bin/git add .
sedang menambahkan direktori kerja saat ini, yang kecuali Anda telah mengubahnya adalah / root
.