web-dev-qa-db-fra.com

Le travail Cron ne fonctionne pas

J'ai un fichier sh appelé m.sh avec le contenu:

echo "Cleaning memory"
sync; echo 3 > /proc/sys/vm/drop_caches
echo ""
free -m

echo ""

ps cax | grep Java > /dev/null
if [ $? -eq 0 ]; then
  echo "== Server is already running =="
else
  sh a.sh
  echo "========== STARTING THE SERVER =========="
fi

Quand je l'exécute avec sh m.sh ça marche parfaitement. Mais j'en ai besoin pour fonctionner toutes les 5 minutes, donc j'utilise des tâches cron. Il doit fonctionner en tant que root/Sudo, donc j'ai fait Sudo -s, puis crontab -e et écrit ceci dans le fichier:

0,4,9,14,19,24,29,34,39,44,49,54 * * * * /bin/sh /home/<username>/m.sh

J'avais fait des recherches, et j'ai appris que le cron a des chemins différents de ceux de l'utilisateur, c'est pourquoi j'ai utilisé ces chemins absolus, pour m'en assurer.

Le travail cron n'exécutait pas le script toutes les 5 minutes, comme il était censé le faire.

J'ai aussi ajouté

* * * * * /bin/echo "Testing123"

pour tester si cron fonctionnait du tout, et rien ne montait dans la console.

Comment puis-je faire exécuter au cron le script toutes les 5 minutes? J'ai fait des recherches en ligne et essayé les solutions, mais je n'ai pas réussi à le faire fonctionner pour moi. J'ai fait service cron start et il a dit qu'il fonctionnait déjà. J'ai également redémarré le service. Les autorisations sont définies correctement, j'ai donné à tous les utilisateurs des autorisations de lecture, d'écriture et d'exécution juste pour m'assurer (je sais que les autorisations sont correctes).

1
user172548

Concernant votre script de test - les tâches crontab ne sont pas connectées à une console physique, donc ne vous attendez à aucune sortie. Essayer

* * * * * /bin/touch /tmp/foo

... et voyez si le /tmp/foo le fichier est mis à jour. Cela devrait.

Pour exécuter un script toutes les cinq minutes, il existe un raccourci:

*/5 * * * * /bin/sh /whatever/script/blah.sh

De plus, je modifierais votre script de telle sorte qu'il enregistre son activité. Par exemple,

LOGFILE=/var/log/leoncleaner.log
# ...
echo `date '+%Y-%m-%d %H:%M:%S'` Starting server >> $LOGFILE

Alternativement, vous pouvez rediriger la sortie du fichier crontab directement:

*/5 * * * * /bin/sh /whatever/script/blah.sh >> /var/log/leoncleaner.log
2
January

Essayez d'exécuter echo PATH=$PATH > path.tmp. Ajoutez ensuite le contenu de path.tmp au début de votre script. Cela fournira le même chemin que vous avez interactivement vers le script.

Vous voudrez peut-être ajouter un chemin de coup au début de votre script. Quelque chose comme #!/bin/bash devrait marcher.

Assurez-vous également que votre script est exécutable. Exécutez la commande chmod +x m.sh. Ensuite, testez votre script peut être exécuté comme ./m.sh.

La sortie du script doit être envoyée à l'ID utilisateur de la crontab qu'il exécute. Dans le cas de root, assurez-vous d'avoir un alias pour un ID utilisateur que vous surveillez pour le courrier dans /etc/aliases. Généralement, vous ne voulez pas de sortie à partir de scripts cron, sauf si quelque chose échoue. Redirigez la sortie vers un journal si vous en avez besoin.

0
BillThor