Puncte:0

script-uri de backup baze de date sqlite, atunci când rulează ca un cron, db-ul și numele sunt alterate

drapel in

Am un crontab:

 * * * * * /home/ipa/web/backup.sh > /dev/null 2>&1

(Nu, nu rulează în fiecare minut doar testând aici)

Backup.sh are asta:

#!/usr/bin/env sh



sqlite3 /home/ipa/web/ipa_django/mysite/db.sqlite3 „.backup „backup_file.sqlite3””
src="/home/ipa/web/backup_file.sqlite3"
lasă secunde=$(data +%H)*3600+$(data +%M)*60+$(data +%S)
echo $secunde
filename="db.sqlite3"
echo $nume fișier.$secunde
dest="/home/ipa/web/db_backups/"$filename.$secunde
cp $src $dest
cd /home/ipa/web/db_backups
tar -cvzf ipadbbackup.tar.gz $filename.$secunde
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 „Rulează backup e-mail”
python2.7 backup_via_email.py
rm ipadbbackup.tar.gz

Ideea este să copiez baza de date într-o zonă de zero, să o zip, să o copiez unde o poate găsi un alt fișier .py și să o trimit prin e-mail ca rezervă.

Problema este că:

Dacă rulez acest script de unde locuiește: /home/ipa/web/

cu un ./backup.sh

Funcționează excelent, primesc fișierul în e-mail, funcționează grozav: db.sqlite3.77627

sau ce nu... problema este că atunci când rulează ca cron fișierul nu este complet și numele fișierului este:

db.sqlite3.

Nu pot să-mi dau seama ce despre rularea ca un cron îl face în esență să eșueze? Fișierul din tar este și cu 2.1k mai mic? Deci nu sunt sigur ce se întâmplă... nici măcar nu sunt sigur unde să caut.

Egidijus avatar
drapel nz
Pentru lucruri precum backup-uri, recomand să folosiți căi absolute pentru binare, pentru a vă asigura că utilizați versiunea așteptată. +1, ar trebui să utilizați bash sau să creați un cronjob pentru a imprima env vars pentru a depana cu ce funcționează cron-ul dvs., față de ceea ce aveți.
Puncte:4
drapel gu

Cel mai probabil, de fapt nu alergi ./backup.sh atunci când îl rulați manual, ci mai degrabă bash ./backup.sh.

Singura modalitate compatibilă cu POSIX de a calcula o valoare prin shell este cu $(( expr )).

În general, dacă nu aveți un motiv foarte întemeiat, scripturile ar trebui să folosească bash, deoarece majoritatea oamenilor nu știu diferența dintre sh și bash și vor scrie doar scripturi stricate.

#!/usr/bin/env bash

set -e
set -u

declara -r db_src="/home/ipa/web/ipa_django/mysite/db.sqlite3"
declara -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" "$(nume de bază "${db_dst}" )"
rm „${db_dst}”

echo „Rulează backup e-mail”
cd „/home/ipa/web” 
python2.7 backup_via_email.py
rm ipadbbackup.tar.gz

Asigurați-vă întotdeauna că vă înregistrați ieșirea cron atunci când încercați să depanați, bănuiesc că ați fi văzut un comanda negăsită: let undeva.

Ginnungagap avatar
drapel gu
A trebuit să scriu asta pe telefon, așa că nu ezitați să remediați orice greșeală prin intermediul butonului de editare și să acceptați scuzele mele în avans pentru orice greșeli pe care le-am putut face

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.