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).
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
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.