web-dev-qa-db-fra.com

Pourquoi mon script cron pour vider une base de données MySQL n'est-il pas exécuté?

J'ai le travail cron suivant:

* * * * * /home/db_backups/test.sh

qui fonctionne bien et est exécuté chaque minute. Si je vérifie avec Sudo grep \(CRON\) /var/log/syslog j'obtiens ce qui suit:

Jun 23 11:30:01 analytics CRON[9301]: (CRON) info (No MTA installed, discarding output)

Toutefois, si je modifie le fichier exécutable en inreadobase_backup.sh:

* * * * * /home/db_backups/inreadobase_backup.sh

le script n'est pas exécuté - je ne vois aucun enregistrement dans le journal. Le fichier exécutable, s'il est exécuté par lui-même, fait le travail sans erreur. Voici le contenu du fichier:

Sudo mysqldump -h example.com -u username -ppassword dbname | gzip > db.Zip

Les deux fichiers exécutables ont des autorisations d'exécution accordées à tout le monde. Où devrais-je regarder pour identifier le problème?

EDIT

Le travail s'exécute et crée des sauvegardes avec succès si j'ajoute à Sudo crontab -e la ligne suivante:

*/5 * * * * mysqldump -h example.com -u username -ppassword dbname | gzip > db.Zip

Toutefois, si je déplace la ligne d'exécution mysqldump... db.Zip vers le fichier inreadobase_backup.sh et le spécifie pour le travail:

*/5 * * * * /home/db_backups/inreadobase_backup.sh

le travail ne crée pas de sauvegardes. Je ne sais pas comment vérifier s'il fonctionne et quelle erreur il génère, le cas échéant. Si j'exécute simplement /home/db_backups/inreadobase_backup.sh en ligne de commande, la sauvegarde est créée. Et la seule ligne que le fichier contient est la suivante:

mysqldump -h example.com -u username -ppassword dbname | gzip > db.Zip

Je suppose que vous avez ajouté ceci en tant que crontab de votre propre utilisateur. Le problème est que cron n'a aucun moyen de s'authentifier auprès de Sudo et qu'il ne peut donc pas exécuter votre commande. La solution la plus simple consiste à ajouter la crontab au compte de root:

Sudo crontab -e

Ensuite, ajoutez cette ligne:

* * * * * mysqldump -h example.com -u username -ppassword dbname | gzip > db.Zip

Il n'est pas nécessaire d'avoir un script pour quelque chose d'aussi simple, vous pouvez donc aussi ajouter la commande elle-même. De toute façon, vous ne voulez pas utiliser Sudo avec elle.


En réponse à votre modification:

Pour exclure diverses complications possibles, donnez à inreadobase_backup.sh l'apparence suivante:

#!/bin/sh
/usr/bin/mysqldump -h example.com -u username -ppassword dbname | /bin/gzip > /home/maximus/db.Zip 

Ensuite, pour capturer les erreurs éventuelles, redirigez la sortie d'erreur du script vers un fichier en ajoutant 2> file à votre ligne cron:

*/5 * * * * /home/db_backups/inreadobase_backup.sh 2> /tmp/cron.error

Vous pouvez ensuite vérifier /tmp/cron.error pour plus de détails.

7
terdon