Existe-t-il un moyen d'exécuter un script toutes les minutes (ou 2, ou 5, etc.), mais uniquement s'il n'est pas déjà en cours d'exécution?
Nous avons un ensemble de scripts qui doivent s'exécuter toutes les minutes. Parfois, ils peuvent commencer et terminer en une seconde, d'autres fois, ils peuvent durer 5 minutes.
Notre façon actuelle d'éviter les exécutions simultanées consiste à définir un is_running
indicateur dans chaque script et à quitter s'il est toujours activé. Mais cela n'est pas fiable (c'est-à-dire que des erreurs fatales entraîneraient l'activation du drapeau même après l'arrêt du script).
Nous pourrions écrire notre propre petit gestionnaire, mais je me demande s'il existe déjà une solution plus à la mode.
Réponses:
une meilleure façon est d'utiliser à la
flock
place d'un fichier pid. consultez la page de manuel: flock (1) . L'avantage est que, quelle que soit la façon dont un processus se termine / s'éteint, le verrou disparaît.la source
J'aurais tendance à être d'accord avec la réponse du fichier pid de Warner. Cependant, la fonctionnalité suivante d'Anacron accomplit-elle cela?
Je ne l'ai pas testé moi-même, je ne trouve pas la documentation d'anacron assez complète ...
Si vous voulez être particulièrement paresseux ;-) Vous pouvez simplement quitter le script si greping via la sortie ps renvoie le processus en cours d'exécution. Mais un fichier lock / pid est préférable.
la source
anacron
etcron
faire, mais ils résolvent différents problèmes. À l'aide decron
, comment commenceriez-vous un travail qui a été manqué parce qu'une machine était en panne? En utilisantanacron
, comment voulez-vous commencer un travail tous les 25 décembre ou toutes les 5 minutes? (Vous pouvez, bien sûr, des solutions de contournement de script, mais ce n'est pas ce dont je parle.)anacron
ne fonctionne pas à des périodes plus courtes qu'une journée.C'est la bonne solution pour cette approche. En règle générale, un fichier pid est utilisé et un test pid est effectué par rapport au processus pour s'assurer qu'il fonctionne. S'il est périmé, le fichier de verrouillage sera supprimé et le processus s'exécutera de toute façon.
Toute intelligence supplémentaire serait généralement écrite dans le logiciel lui-même, en tant que démon, par opposition à l'exécution dans cron.
la source
Si vos scripts sont codés dans un langage qui prend en charge l'appel système flock (2), vous pouvez également flocker un fichier de verrouillage avec un appel de fonction. Exemple:
Si vous êtes bloqué avec Bash ou un autre langage de script qui ne le supporte pas, la solution déjà proposée avec flock (1) est également très bien.
PS Dans tous les cas, vous ne devez créer un fichier de verrouillage distinct qu'une seule fois (s'il n'existe pas déjà) et ne jamais le supprimer. Le répertoire "/ var / lock" est un bon endroit pour de tels fichiers.
la source
Ceci est une solution si votre script s'exécute en python (ou vous pouvez créer une commande python à exécuter avant la commande suivante) - J'ai rencontré ce problème exactement la semaine dernière, et bien que j'aie trouvé de bonnes solutions, j'ai décidé de faire un très package python simple et propre et téléchargé sur PyPI. Vous pouvez certainement verrouiller
__file__
pour ne pas avoir à penser à lui donner un nom de ressource personnalisé à verrouiller.Installer avec:
pip install quicklock
Son utilisation est extrêmement simple:
Jetez un œil: https://pypi.python.org/pypi/quicklock
la source