Wie stelle ich sicher, dass immer nur eine Instanz eines Ruby-Skripts ausgeführt wird?

8

Ich habe einen Prozess, der alle fünf Minuten auf Cron läuft. Normalerweise dauert es nur ein paar Sekunden, aber manchmal dauert es einige Minuten. Ich möchte sicherstellen, dass jeweils nur eine Version ausgeführt wird.

Ich habe es offensichtlich versucht ...

%Vor%

... aber es testet nicht, um zu sehen, ob es die Sperre bekommen kann, es blockiert, bis die Sperre aufgehoben wird.

Irgendeine Idee, was ich vermisse? Ich würde lieber nicht etwas mit ps hacken, aber das ist eine Alternative.

    
Jason Butler 19.03.2009, 10:30
quelle

9 Antworten

3

Obwohl dies nicht direkt Ihre Frage beantwortet, würde ich wahrscheinlich ein Daemon-Skript schreiben (Sie könnten Ссылка )

Sie könnten Ihren Indexer (unter der Annahme, dass er indexer.rb verwendet) durch ein Wrapper-Skript mit dem Namen script / index führen, zum Beispiel:

%Vor%

Und Ihr Indexer kann fast dasselbe machen, außer dass Sie ein Schlafintervall angeben

%Vor%

So funktionieren Job-Prozessoren in Verbindung mit einem Queue-Server normalerweise.

    
ucron 19.03.2009, 11:37
quelle
22

Ich weiß, dass das alt ist, aber für jeden Interessierten gibt es eine nicht blockierende Konstante, die du an die Herde weitergeben kannst, so dass sie zurückkehrt, anstatt zu blockieren.

%Vor%

Aktualisieren Sie für slhck

flock gibt true zurück, wenn dieser Prozess die Sperre empfangen hat, andernfalls false. Um sicherzustellen, dass nur ein Prozess gleichzeitig ausgeführt wird, möchten Sie nur versuchen, die Sperre zu erhalten, und beenden, wenn Sie nicht in der Lage sind. Es ist so einfach wie ein exit unless vor die obige Codezeile zu setzen:

%Vor%     
smathy 01.12.2010 18:07
quelle
4

Je nach Ihren Anforderungen sollte dies gut funktionieren und Sie müssen keine andere Datei irgendwo erstellen.

%Vor%     
Matt Todd 02.02.2011 16:23
quelle
3

Sie können eine temporäre Datei erstellen und löschen und auf das Vorhandensein dieser Datei prüfen. Bitte überprüfen Sie die Antwort auf diese Frage: ein Shell-Skript für eine Instanz

    
shodanex 19.03.2009 10:33
quelle
3

Für genau diese Situation gibt es ein Lockfile-Juwel . Ich habe es schon einmal benutzt und es ist todschick.

    
Sarah Mei 19.03.2009 16:36
quelle
2

Wenn Sie cron benutzen, ist es vielleicht einfacher, so etwas in dem Shell-Skript zu tun, das cron aufruft:

%Vor%     
pisswillis 19.03.2009 12:44
quelle
1

Ok, arbeite mit Notizen von @ shodanex's Zeiger, hier ist was ich habe. Ich habe es ein bisschen rubiniert (obwohl ich in Ruby kein Analogon kenne).

%Vor%     
Jason Butler 19.03.2009 10:51
quelle
0

Auf einer höheren Ebene finden Sie möglicherweise den lock_method Edelstein nützlich:

%Vor%

Es verwendet standardmäßig Lockfiles, die auf dem lokalen Dateisystem gespeichert sind (was oben besprochen wurde), aber Sie können auch Remote Lock Storage konfigurieren:

%Vor%

Auch ...

%Vor%     
Seamus Abshere 17.03.2011 01:51
quelle
0

Können Sie File :: LOCK_NB nicht zu Ihrer Sperre hinzufügen, um sie nicht zu blockieren (d. h. es schlägt fehl, wenn sie die Sperre nicht erhalten kann)

Das würde in C, Perl usw. funktionieren.

    
MarkR 19.03.2009 13:30
quelle

Tags und Links