У меня есть crontab:
* * * * * /home/ipa/web/backup.sh > /dev/null 2>&1
(Нет, он не запускается каждую минуту, просто тестирую здесь)
В файле backup.sh есть это:
#!/usr/bin/env sh
sqlite3 /home/ipa/web/ipa_django/mysite/db.sqlite3 ".backup 'backup_file.sqlite3'"
src="/home/ipa/web/backup_file.sqlite3"
let seconds=$(date +%H)*3600+$(date +%M)*60+$(date +%S)
echo $seconds
filename="db.sqlite3"
echo $filename.$seconds
dest="/home/ipa/web/db_backups/"$filename.$seconds
cp $src $dest
cd /home/ipa/web/db_backups
tar -cvzf ipadbbackup.tar.gz $filename.$seconds
cd /home/ipa/web/
cp /home/ipa/web/db_backups/ipadbbackup.tar.gz ipadbbackup.tar.gz
rm /home/ipa/web/db_backups/$filename.$seconds
rm /home/ipa/web/db_backups/ipadbbackup.tar.gz
#rm "$srcfile"
/usr/bin/bash start-app.sh;
echo "Running email backup"
python2.7 backup_via_email.py
rm ipadbbackup.tar.gz
Идея заключается в том, что я копирую базу данных в резервную область, заархивирую ее, скопирую туда, где ее может найти другой файл.py, и отправлю по электронной почте в качестве резервной копии
Проблема.:
Если я запущу этот скрипт оттуда, где он живет:/home/ipa/web/
с./backup.sh
Отлично работает, я получаю файл по электронной почте, работает отлично:db.sqlite3.77627
или что-то еще... проблема в том, что когда он запускается как cron, файл не завершен, а имя файла:
db.sqlite3.
Я не могу понять, что в том, что он работает как cron, приводит к его сбою? Файл в таре тоже на 2.1к меньше? Так что не знаю, что происходит... даже не знаю, где искать.
Скорее всего, вы запускаете не ./backup.sh
вручную, а скорее bash./backup.sh
.
Единственный совместимый с POSIX способ вычисления значения через оболочку — это $(( expr ))
.
В общем, если у вас нет веской причины, скрипты должны использовать bash, так как большинство людей не знают разницы между sh и bash и просто пишут неработающие скрипты.
#!/usr/bin/env bash
set -e
set -u
declare -r db_src="/home/ipa/web/ipa_django/mysite/db.sqlite3"
declare -r db_bak="/home/ipa/web/backup_file.sqlite3"
declare -r db_dst="/home/ipa/web/db_backups/db.sqlite3.$[ EPOCHSECONDS % 86400 ]"
sqlite3 "${db_src}" ".backup 'backup_file.sqlite3'"
cp "${db_bak}" "${db_dst}"
cd "$( dirname "${db_dst}" )"
tar -czf "/home/ipa/web/ipadbbackup.tar.gz" "$( basename "${db_dst}" )"
rm "${db_dst}"
echo "Running email backup"
cd "/home/ipa/web"
python2.7 backup_via_email.py
rm ipadbbackup.tar.gz
Всегда записывайте вывод cron при попытке отладки, полагаю, вы где-то видели command not found: let
.