Eu tenho um crontab:
* * * * * /home/ipa/web/backup.sh > /dev/null 2>&1
(Não, não roda a cada minuto apenas testando aqui)
O backup.sh tem isso:
#!/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
A idéia é copiar o banco de dados para uma área de rascunho, compactá-lo, copiá-lo para onde outro arquivo .py possa encontrá-lo e enviá-lo por e-mail como backup.
O problema é:
Se eu executar este script de onde ele mora: /home/ipa/web/
com um ./backup.sh
Funciona muito bem, recebo o arquivo no meu email funciona muito bem: db.sqlite3.77627
ou o que não... o problema é que quando roda como cron o arquivo não está completo e o nome do arquivo é:
db.sqlite3.
Não consigo descobrir o que acontece com a execução de um cron que está fazendo com que ele falhe essencialmente? O arquivo no tar também é 2,1k menor? Então, não tenho certeza do que está acontecendo... nem sei onde procurar.
Provavelmente, você não está realmente executando
./backup.sh
ao executá-lo manualmente, mas simbash ./backup.sh
.A única maneira compatível com POSIX de calcular um valor por meio do shell é com
$(( expr ))
.Em geral, a menos que você tenha uma boa razão, os scripts devem usar o bash, já que a maioria das pessoas não sabe a diferença entre sh e bash e apenas escreverá scripts quebrados.
Sempre certifique-se de registrar sua saída do cron ao tentar depurar, suponho que você tenha visto um
command not found: let
em algum lugar.