Ubuntu
腳本備份 sqlite 數據庫,當作為 cron 執行時,數據庫和名稱被破壞
我有一個 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 之間的區別,只會編寫損壞的腳本。
#!/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
某個地方看到過。