web-dev-qa-db-fra.com

Le script Bash ne s'exécute pas à partir de crontab

J'ai le script bash suivant:

#!/bin/bash
mysqldump -u ******** -p********  --all-databases | gzip > /home/srvlinux01/MySQLBackups/database_$(date +\%Y-\%m-\%d).sql.gz

qui se trouve dans /home/srvlinux01/MySQLBackups/ en tant que backup.sh avec les autorisations suivantes

-rwxr--r-- 1 root       root           134 feb 27 12:48 backup.sh

J'ai configuré un cronjob sur Sudo crontab -e pour l'exécuter tous les jours, la nuit

#Automatic MySQL backup
30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh

Mais je reçois par email l'erreur suivante:

sh: 0: Can't open /home/srvlinux01/MySQLBackups/backup.sh

J'ai essayé différentes configurations, mais je ne peux pas comprendre ce qui ne va pas. Je peux exécuter le script manuellement et tout se passe à la perfection, alors je suppose qu'il y a un problème avec mon entrée dans cronjob, mais je ne peux pas vraiment comprendre quoi. Pourriez-vous s'il vous plaît m'aider à comprendre? Merci!

19
Mateusz Kapusta

Vous devez donner à votre cron un PATH. Par exemple:

Shell=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin 

Dans votre cas, essayez de mettre ceci avant votre commande. Consultez le wiki de la communauté dans cette question pour plus d'informations sur les raisons pour lesquelles la variable PATH est nécessaire. Voici un extrait; essentiellement l'idée est que cron ne lit pas /etc/environment:

Un "gotcha" commun est que la variable d'environnement PATH est différente. Peut-être que votre script cron utilise la commande somecommand qui se trouve dans /opt/someApp/bin, que vous avez ajoutée à PATH dans /etc/environment? cron ne lit pas ce fichier, donc exécuter somecommand à partir de votre script échouera s'il est exécuté avec cron, mais fonctionnera s'il est exécuté dans un terminal. Pour contourner ce problème, définissez simplement votre propre variable PATH en haut du script.

16
don.joey
chmod +x /home/srvlinux01/MySQLBackups/backup.sh             

essayez d'exécuter votre script avec un chemin complet sur la ligne de commande:

/home/srvlinux01/MySQLBackups/backup.sh

s'il n'est pas en cours d'exécution - quelque chose ne va pas (erreur de chemin)

Assurez-vous que c'est votre crontab

crontab -e 

non Sudo:

Sudo crontab -e

est root crontab - et root ne peut pas trouver votre script;)

supprimer "sh" dans crontab suffit d'écrire:

30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh
8
toe

Je peux voir une erreur dans la configuration de votre fichier crontab. Dans la configuration ci-dessous, vous essayez d'appeler backup.sh comme dans votre invite de shell avec le préfixe sh qui risque de ne pas fonctionner dans cron.

#Automatic MySQL backup
30 3 * * * sh /home/srvlinux01/MySQLBackups/backup.sh
  1. changer le propriétaire comme dit dans le commentaire, si nécessaire.
  2. Faites-en un exécutable.
    chmod a + x <nom du fichier>
  3. Mettez à jour votre crontab pour refléter cela. (appelant le fichier directement, Shell est utilisé conformément à la ligne Shebang dans le fichier)

    #Automatic MySQL backup
    30 3 * * * /home/srvlinux01/MySQLBackups/backup.sh
    

J'espère que cela aiderait.

8
Naha