我有一个 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 运行会导致它基本上失败吗?tar 中的文件也小了 2.1k?所以不知道发生了什么......甚至不知道在哪里看。
最有可能的是,您在
./backup.sh
手动运行时实际上并没有在运行,而是在bash ./backup.sh
.通过 shell 计算值的唯一符合 POSIX 标准的方法是使用
$(( expr ))
.一般来说,除非你有充分的理由,否则脚本应该使用 bash,因为大多数人不知道 sh 和 bash 之间的区别,只会编写损坏的脚本。
尝试调试时,请务必记录您的 cron 输出,我猜您会在
command not found: let
某个地方看到过。