2008-09-01 11 views
5

Gibt es eine einfache Möglichkeit zu sagen, ob ein Ruby-Skript bereits ausgeführt wird, und es dann entsprechend zu behandeln? Zum Beispiel: Ich habe ein Skript namens real_long_script.rb. Ich habe es geschafft, alle 5 Minuten zu laufen. Wenn es läuft, möchte ich sehen, ob der vorherige Lauf noch läuft und dann die Ausführung des zweiten Skripts stoppen. Irgendwelche Ideen?Ermitteln Sie, ob ein Ruby-Skript bereits ausgeführt wird

Antwort

9

Der ps ist eine wirklich schlechte Art und Weise davon und wahrscheinlich offen für Rennbedingungen zu tun.

Der traditionelle Unix/Linux Weg wäre, die PID in eine Datei zu schreiben (normalerweise in/var/run) und zu überprüfen, ob diese Datei beim Start existiert.

z.B. Die PID-Datei befindet sich unter /var/run/myscript.pid. Dann sollten Sie vor dem Ausführen des Programms prüfen, ob diese Datei vorhanden ist. Es gibt ein paar Tricks, um Race-Bedingungen zu vermeiden, die O_EXCL (Sperren ausschließen) beinhalten, um die Datei und symbolische Links zu öffnen.

Wie auch immer, Sie sollten versuchen, einen Code zu schreiben, um Race Conditions durch atomare Operationen auf dem Dateisystem zu vermeiden.

neu zu erfinden das Rad zu sparen, könnte man bei http://rubyforge.org/projects/pidify/

0

In 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

aussehen wollen, sollten Sie wahrscheinlich auch prüfen, dass der Prozess tatsächlich ausgeführt wird, so dass, wenn Ihr Skript stirbt, ohne selbst aufräumen, es ist die laufen beim nächsten Mal, anstatt einfach zu überprüfen, ob /var/run/foo.pid existiert und beendet wird.

0

Highlander

Beschreibung

Ein Juwel, das nur eine Instanz des Haupt-Skript stellt sicher ausgeführt wird. Kurz gesagt, es kann nur einen geben.

Installations

gem install highlander 

Synopsis

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

der Zwischenzeit wieder auf der Kommandozeile ...

# 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 

Hinweise

einfach das Hochländer gem erfordern sorgt für tha t nur eine Instanz dieses Skripts kann nicht erneut gestartet werden. Wenn Sie versuchen, es erneut zu starten, wird einen RuntimeError auslösen.

Verwandte Themen