J'ai écrit un script pour sauvegarder une base de données. Quand je l'exécute directement, cela fonctionne. J'ai essayé d'en faire un travail cron et, pendant qu'il fonctionne (j'ai vérifié avec service status cron
), il semble qu'il échoue en silence.
Voici le script:
#!/bin/bash
echo "Starting mongo backup"
mkdir /home/ubuntu/backups
docker exec -it mongodb mongodump --archive=/root/mongodump.gz --gzip
docker cp mongodb:/root/mongodump.gz /home/ubuntu/backups/mongodump_$(date +%Y-%m-%d_%H-%M-%S).gz
echo "Mongo dump complete"
printf "[default]\naccess_key=\nsecret_key=\nsecurity_token=\n" > ~/.s3cfg
s3cmd put /home/ubuntu/backups/* s3://my-backup-bucket/
echo "Copy to S3 complete"
rm /home/ubuntu/backups/* -r
echo "Files cleaned"
J'ai utilisé uniquement des chemins absolus ((EDIT: ouais en fait je ne l'ai pas fait)), pas de variable d'environnement, pas de% non échappé. Je ne sais pas ce que j'ai manqué.
Une des raisons possibles est que vous n'utilisez pas de chemins absolus pour les commandes et que certaines de vos commandes ne sont pas situées dans /usr/bin
ou /bin
qui appartiennent à $PATH
envvar dans Cron par défaut.
Vous pouvez trouver où se trouve chaque exécutable de vos commandes à l'aide de la commande which
, par exemple which s3cmd
. Ensuite, vous pouvez mettre les commandes avec leurs chemins absolus dans votre script.
Une autre approche consiste à attribuer une nouvelle valeur à $PATH
dans votre script ou dans crontab
: Pourquoi les scripts crontab ne fonctionnent-ils pas?
Vous pouvez rediriger la sortie de votre Cronjob vers un fichier pour déboguer où est le problème. Pour cela, modifiez votre travail de la manière suivante:
* * * * * /path/to/the-script >/path/to/log-file 2>&1
De plus, je préférerais utiliser $HOME
au lieu de ~
dans les scripts.