cron est presque toujours la meilleure solution.
Si vous essayez de le faire vous-même avec un simple script en cours d'exécution dans une boucle while:
while true; do
task
sleep 300
done
vous trouvez finalement que rien ne se passe parce que votre tâche a échoué en raison d'une erreur passagère. Ou le système a redémarré. Ou certains tels. Rendre votre script assez robuste pour faire face à toutes ces éventualités est un travail difficile et inutile. C'est pour ça que cron est, après tout.
De même, si la tâche prend une durée non négligeable, la boucle while simple d'esprit ci-dessus se désynchronise lentement avec l'horloge. Cela pourrait être corrigé:
while true; do
task
sleep $((300 - $(date +%s) % 300))
done
Encore une fois, ça ne vaut pas le coup puisque cron le fera aussi pour vous. Cependant, cron ne vous sauvera pas du lancement de la tâche avant la fin de l'invocation précédente, si l'invocation précédente s'est bloquée d'une manière ou d'une autre. Ce n'est donc pas un trajet complètement gratuit, mais cela vous procure encore plus de robustesse.
Une approche simple pour résoudre le problème de tâche bloquée consiste à utiliser l'utilitaire flock
. Par exemple, vous pouvez cron
un script contenant les éléments suivants:
(
flock -n 8 || {
logger -p user.warning Task is taking too long
# You might want to kill the stuck task here. See pkill
exit 1
}
# Do the task here
) 8> /tmp/my_task.lck
problème
avec Cron est que vous devez vérifier si l'exécution précédente est terminée. – michael501
@michael merci, édité –