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.
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.
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% 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:
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
Für genau diese Situation gibt es ein Lockfile-Juwel . Ich habe es schon einmal benutzt und es ist todschick.
Wenn Sie cron benutzen, ist es vielleicht einfacher, so etwas in dem Shell-Skript zu tun, das cron aufruft:
%Vor%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%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%