web-dev-qa-db-fra.com

Cron job n'exécutant pas

Je faisais un travail cron pour sauver mon monde Minecraft de mon bélier toutes les 5 minutes. J'ai testé le script et il semble fonctionner.

Voici à quoi ressemble le script:

#!/bin/sh


VOLATILE="/home/jonathan/Games/Minecraft/Server/world/"
PERMANENT="/home/jonathan/Games/Minecraft/Server/world_storage/"
rsync -r -t -v "$VOLATILE" "$PERMANENT"

Alors je suis allé ajouter un travail cron pour exécuter le script toutes les 5 minutes, et il ne semble pas l'exécuter.

C'est le script que j'ai utilisé:

*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh

Quelqu'un peut-il m'aider s'il-vous-plaît?

1
user77242

Vous n'avez pas précisé comment vous avez ajouté votre travail cron. Cela fait une grande différence: si vous avez utilisé crontab -e dans votre propre compte, les scripts sont exécutés avec votre utilisateur (et donc l'entrée crontab a un champ de moins - l'utilisateur le lance, comme on le sait). . Si vous copiez simplement l'extrait ci-dessus dans /etc/cron.d, il échouera si vous ne spécifiez pas d'utilisateur (ou plutôt s'il ne trouve aucun utilisateur nommé "bash"). Donc, vous devriez prendre les mesures suivantes:

  1. mettez à jour votre question avec des informations sur la manière dont vous avez ajouté le travail cron
  2. vérifier les journaux du système (/var/log/syslog; ils pourraient indiquer d'éventuelles erreurs)
  3. ajoutez des sorties de débogage à votre script Backup.sh pour voir s'il est démarré

Le troisième point peut être atteint de plusieurs manières:

  • ajoutez un >>/tmp/testlog.log à la fin de votre entrée dans la crontab (pour rediriger la sortie dans un fichier que vous pouvez explorer; en outre, un 2>&1 inclurait la sortie de la console d'erreur)
  • ajoutez quelques lignes à votre script lui-même, comme par exemple echo "Backup.sh started">/tmp/testlog.log

De plus: comme vous voulez que votre script soit exécuté avec bash, vous ne devriez pas lui dire d'utiliser /bin/sh (ce qui l'obligerait à utiliser dash sur une installation Ubuntu par défaut), mais plutôt /bin/bash. Ensuite, rendez-le exécutable, et vous pouvez même omettre le "bash" de votre entrée dans la crontab.

Mise à jour:

Selon votre commentaire sur ma réponse, vous avez utilisé crontab -e pour créer le travail. Selon les journaux de votre système, il est exécuté, mais la définition est plutôt

*/5 * * * * bash /home/jonathan/Games/Minecraft/Server/Backup.sh &>/dev/null

Ceci redirige toute la sortie vers le plus grand stockage de votre système, le "trou noir": /dev/null mange tout (mais ne renvoie jamais rien). En redirigeant STDOUT et STDERR de cette manière, vous ne pourrez plus avoir de rapport d'erreur - vous ne saurez donc jamais qu'ils se sont produits, sans parler des détails. Pour tester, vous devriez omettre complètement la partie &>/dev/null. Même si cela fonctionne, vous ne devez supprimer que les sorties inutiles. Sinon, vous ne savez jamais quand quelque chose se passe mal. Il vaut donc mieux laisser au moins l'esperluette pour que Cron puisse signaler les erreurs éventuelles.

De plus: une fois que la sortie est redirigée (comme dans votre cas à /dev/null), ajouter une autre redirection à la fin ne donnera aucun résultat, car tout est déjà parti. Donc, je dois ajuster le conseil ci-dessus de "ajouter ... à la fin de votre entrée crontab" pour "remplacer celui dans votre entrée crontab";)

5
Izzy