2008-09-01 8 views
5

Y at-il un moyen facile de savoir si un script ruby ​​est déjà en cours d'exécution et de le gérer de manière appropriée? Par exemple: J'ai un script appelé really_long_script.rb. Je l'ai cronné pour courir toutes les 5 minutes. Quand il s'exécute, je veux voir si l'exécution précédente est encore en cours et ensuite arrêter l'exécution du deuxième script. Des idées?Déterminer si un script ruby ​​est déjà en cours d'exécution

Répondre

9

Le PS est un moyen très pauvre de faire cela et probablement ouvert à des conditions course. La méthode Unix/Linux traditionnelle consiste à écrire le PID dans un fichier (généralement dans/var/run) et à vérifier si ce fichier existe au démarrage.

par exemple. le fichier pid étant situé à /var/run/myscript.pid, vous vérifieriez s'il existe avant d'exécuter le programme. Il y a quelques astuces pour éviter les conditions de course impliquant l'utilisation de O_EXCL (verrouillage exclusif) pour ouvrir le fichier et les liens symboliques.

Cependant peu probable, vous devriez essayer de coder pour éviter les conditions de concurrence en utilisant des opérations atomiques sur le système de fichiers.

Pour enregistrer réinventer la roue, vous voudrez peut-être regarder http://rubyforge.org/projects/pidify/

0

En bash:

if ps aux | grep really_long_script.rb | grep -vq grep 
then 
    echo Script already running 
else 
    ruby really_long_script.rb 
fi 
0

Vous devriez également vérifier que le processus est en fait en cours d'exécution, de sorte que si votre script meurt sans se nettoyer, il courra le La prochaine fois, plutôt que de simplement vérifier que /var/run/foo.pid existe et quitte.

0

Highlander

Description de

Un petit bijou qui assure une seule instance de votre script principal est en cours d'exécution. Bref, il ne peut y en avoir qu'un seul.

Installation

gem install highlander 

Synopsis

require 'highlander' # This should be the -first- thing in your code. 
# Your code here 

Pendant ce temps, sur la ligne de commande ...

# First attempt, works. Assume it's running in the background. 
ruby your_script.rb 

# Second attempt while the first instance is still running, fails. 
ruby your_script.rb # => RuntimeError 

Notes de

simplement exiger la pierre précieuse highlander assure tha t une seule instance de ce script ne peut pas être redémarrée. Si vous essayez de le redémarrer , cela provoquera une RuntimeError.

Questions connexes