скрипт создает резервную копию базы данных 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, приводит к его сбою? Файл в таре тоже на 2.1к меньше? Так что не знаю, что происходит... даже не знаю, где искать.

0
задан 12 October 2021 в 23:21
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.

4
ответ дан 18 October 2021 в 19:15

Теги

Похожие вопросы