Gibt es eine Möglichkeit, ein Skript jede Minute (oder 2 oder 5 usw.) auszuführen, aber nur, wenn es noch nicht ausgeführt wird?
Wir haben eine Reihe von Skripten, die jede Minute ausgeführt werden müssen. Manchmal beginnen und enden sie in einer Sekunde, manchmal dauern sie 5 Minuten.
Unsere derzeitige Methode zur Vermeidung gleichzeitiger Ausführungen besteht darin, is_running
in jedem Skript ein Flag zu setzen und zu beenden, wenn es noch aktiviert ist. Dies ist jedoch etwas unzuverlässig (dh schwerwiegende Fehler würden dazu führen, dass das Flag auch nach dem Anhalten des Skripts aktiviert bleibt).
Wir könnten unseren eigenen kleinen Manager schreiben, aber ich frage mich, ob es bereits eine modischere Lösung gibt.
Antworten:
Ein besserer Weg ist die Verwendung
flock
anstelle einer PID-Datei. Überprüfen Sie die Manpage: Herde (1) . Der Vorteil ist, dass unabhängig davon, wie ein Prozess beendet wird / stirbt, die Sperre damit weg ist.quelle
Ich würde Warners Antwort auf die PID-Datei eher zustimmen. Erreicht die folgende Funktion von Anacron dies jedoch?
Ich habe es nicht selbst getestet, ich finde die Dokumentation von anacron nicht gründlich genug ...
Wenn Sie besonders faul sein möchten ;-) Sie können das Skript einfach beenden, wenn das Durchsuchen der ps-Ausgabe den Prozess als ausgeführt zurückgibt. Am besten ist jedoch eine Lock / Pid-Datei.
quelle
anacron
undcron
Tun, aber sie lösen unterschiedliche Probleme. Verwendungcron
, wie würden Sie einen Job starten , die verpasst wurde , weil eine Maschine war nach unten? Verwendunganacron
, wie würden Sie am 25. Dezember oder alle 5 Minuten einen Job starten? (Sie können natürlich Skriptumgehungen durchführen, aber darüber spreche ich nicht.)anacron
auch nicht in kürzeren Zeiträumen als einem Tag.Das ist die richtige Lösung für diesen Ansatz. In der Regel wird eine PID-Datei verwendet und ein PID-Test für den Prozess durchgeführt, um sicherzustellen, dass er ausgeführt wird. Im veralteten Zustand würde die Sperrdatei entfernt und der Prozess trotzdem ausgeführt.
Jede zusätzliche Intelligenz wird normalerweise als Daemon in die Software selbst geschrieben, anstatt in cron ausgeführt zu werden.
quelle
Wenn Ihre Skripte in einer Sprache codiert sind, die den Syscall flock (2) unterstützt, können Sie auch eine Sperrdatei mit einem Funktionsaufruf flock (). Beispiel:
Wenn Sie mit Bash oder einer anderen Skriptsprache nicht weiterkommen, die dies nicht unterstützt, ist die bereits vorgeschlagene Lösung mit flock (1) ebenfalls in Ordnung.
PS In jedem Fall sollten Sie eine separate Sperrdatei nur einmal erstellen (falls noch nicht vorhanden) und niemals löschen. Das Verzeichnis "/ var / lock" ist ein guter Ort für solche Dateien.
quelle
Dies ist eine Lösung, wenn Ihr Skript in Python ausgeführt wird (oder Sie einen Python-Befehl erstellen können, der vor dem nächsten Befehl ausgeführt wird). Ich bin letzte Woche auf genau dieses Problem gestoßen, und obwohl ich einige gute Lösungen gefunden habe, habe ich beschlossen, eine sehr zu erstellen einfaches und sauberes Python-Paket und hochgeladen auf PyPI. Sie könnten sicher sperren,
__file__
um nicht daran denken zu müssen, ihm einen benutzerdefinierten Ressourcennamen zum Sperren zu geben.Installieren mit:
pip install quicklock
Die Verwendung ist sehr einfach:
Schauen Sie sich das an: https://pypi.python.org/pypi/quicklock
quelle