Ubuntu

腳本備份 sqlite 數據庫,當作為 cron 執行時,數據庫和名稱被破壞

  • October 18, 2021

我有一個 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某個地方看到過。

引用自:https://serverfault.com/questions/1080369