Je lance un travail toutes les minutes pour réindexer le contenu de mon site.
Aujourd'hui, le moteur de recherche est mort, et lorsque je me suis connecté, il y avait des centaines de processus orphelins qui avaient été lancés par cron.
Existe-t-il un autre moyen d'utiliser une sorte de logiciel existant qui me permettra d'exécuter un travail toutes les minutes, mais qui ne lancera pas une autre instance si ce travail ne revient pas (c'est-à-dire parce que le processus du moteur de recherche a échoué)?
cron
scheduled-task
John
la source
la source
Réponses:
Le problème n'est pas vraiment avec cron - c'est avec votre travail.
Vous devrez faire interagir votre travail avec un verrou d'une certaine description. La façon la plus simple de le faire est de tenter de créer un répertoire et, en cas de succès, de continuer, sinon de quitter. Une fois votre travail terminé et terminé, il devrait supprimer le répertoire prêt pour la prochaine exécution. Voici un script pour illustrer.
Exécutez-le dans un terminal puis avant 60 secondes, exécutez-le dans un autre terminal, il sortira avec le statut 1. Une fois le premier processus terminé, vous pouvez l'exécuter à partir du deuxième terminal ...
ÉDITER:
Comme je viens d'apprendre le troupeau, j'ai pensé mettre à jour cette réponse. flock (1) peut être plus facile à utiliser. Dans ce cas,
flock -n
cela semble approprié, par exempleExécuterait votre travail toutes les minutes mais échouerait si flock ne pouvait pas obtenir un verrou sur le fichier.
la source
Une façon serait que votre script de réindexation crée un fichier de verrouillage afin qu'il puisse vérifier s'il existe déjà une instance du script en cours d'exécution. Vous pouvez également ajouter une gestion des exceptions pour voir si le moteur de recherche est opérationnel.
Une alternative plus impliquée serait d'utiliser une sorte de file d'attente de tâches comme Resque et Resque-scheduler:
https://github.com/blog/542-introducing-resque
https://github.com/bvandenbos/resque-scheduler#readme
Il y a aussi Qu et Sidekiq:
https://github.com/bkeepers/qu
https://github.com/mperham/sidekiq
Oui, tout est orienté Ruby, mais vous pouvez rechercher des "choses comme resque" dans la langue de votre choix.
la source
Une autre façon de configurer rapidement ceci est d'avoir un script shell démarré au démarrage de la machine (cron peut le faire avec '
@reboot /path/to/my/script.sh
',. Puis redémarrez le cron pour le démarrer) avec quelque chose comme ça.Le script continue de fonctionner, et vous n'en avez démarré qu'un - c'est le nombre qui pourrait être exécuté en même temps - pas plus que cela. Certains éléments intelligents peuvent également vérifier si l'indexeur est en cours d'exécution et, dans le cas contraire, redémarrer ou sinon essayer de résoudre / informer quelqu'un du problème.
la source
Au lieu d'utiliser cron pour cela, je construirais davantage votre travail en tant que service qui s'exécute en boucle et dort pendant 60 secondes comme dernière étape, ou peut-être dort plus souvent pour de plus petits intervalles à différents moments du processus pour aider à répartir la charge plus uniformément.
la source