Gibt es etablierte Muster für die Installation eines Kill- oder Ein / Aus-Schalters für Benutzer-Cron-Jobs?

8

Wir haben längere Builds, für die wir normalerweise unsere Cron-Jobs planen, aber gelegentlich müssen wir einen Build innerhalb eines nicht standardmäßigen Zeitrahmens erneut ausführen und können auf Konflikte mit Cron-Jobs stoßen, deren Ausführung zu diesen Zeiten normalerweise sicher ist.

Wir haben mehrere Konten, auf denen sowohl Builds als auch Cron-Jobs ausgeführt werden. Daher können wir den Crontab-Dienst nicht für den gesamten Computer aussetzen und später neu starten.

Ich habe mich gefragt, ob jemand ein Muster oder eine Implementierung hat. Ich stelle mir das so vor

Benutzer erstellt eine Datei: ~ / block-crontab
Benutzer führt build aus Der Cron-Job sucht nach dieser Datei im Ausgangsverzeichnis des Benutzers und überspringt, wenn sie vorhanden ist, einfach alle Cron-Jobs. Andernfalls werden die Jobs ausgeführt. Wenn der Build abgeschlossen ist, entfernt der Benutzer ~ / block-crontab

Funktioniert das? Ich schätze, ich müsste das Cron-Skript irgendwie ändern. Ich frage mich meistens, ob es einen besseren / standardmäßigen Ansatz für dieses Problem gibt.

Vielen Dank.

Sean
quelle
Was meinst du damit [the build] can run into conflicts with from jobs that are tipically safe to run at those times? Gibt es Jobs ohne Build, die während des Builds nicht ausgeführt werden können? Schließen sich alle Jobs gegenseitig aus? Oder nur in Bezug auf den Build?
GnP
1
Haben Sie Intro flockoder run-one(Debian / Ubuntu) gesucht ? serverfault.com/questions/82857/…
Stefan Lasiewski
Zum Beispiel führen wir jeden Morgen ein großes Datenbank-Update durch. Dann aktualisieren wir jede Stunde bis 24 Uhr die Titelseite mit Nachrichten oder zufälligen Elementen. Wenn es während des Datenbank-Updates ausgeführt wird, fehlen auf der Startseite möglicherweise einige Elemente.
Sean
Habe nicht auf Herde oder Run-One geschaut. Vielen Dank.
Sean

Antworten:

10

Anstatt damit herumzuspielen crond, empfehle ich dringend, eine (sogar einfache) Form des Sperren in Ihren Build-Skripten zu implementieren. Berühren Sie beispielsweise und /var/run/suchen Sie nach einer Datei in : Wenn Ihr Skript etwas findet, erstellt das Projekt einen anderen Prozess. Sie müssen natürlich die Sperrdatei entfernen, wenn Sie fertig sind.

Wie @GnP in den Kommentaren vermerkt, können Sie das flockDienstprogramm auch zum halbautomatischen Verwalten Ihrer Sperrdateien verwenden.

Wenn Sie sich nicht auf einen Sperrmechanismus verlassen können / können, führen Sie einfach ein Problem aus, service crond stopum das crondSystem herunterzufahren .

Shodanshok
quelle
2
Der flockBefehl wäre eine schöne Ergänzung zu dieser Antwort. Es behandelt die Sperrdatei und all die kleinen Details, die es gibt.
GnP
@ GnP Ausgezeichneter Vorschlag! Ich habe meine Antwort entsprechend aktualisiert
Shodanshok
1
Beachten Sie jedoch, dass flockder Dateideskriptor mit untergeordneten Prozessen vererbt wird, es sei denn, Sie machen einen Schritt, um ihn zu schließen. Dies kann manchmal zu unerwarteten Verhaltensweisen führen, insbesondere wenn Benutzer Hintergrundjobs starten, die in cron ausgeführt werden.
Matthew Ife
1

Ich neige dazu, einfach alle lang laufenden Befehle in einen Bildschirm cronzu packen und den Bildschirm nur zu starten, wenn noch keiner ausgeführt wird.

Also die folgende Zeile in crontab

*/2 * * * *  /bin/bash /path/to/LongRunningScript.bash

... verwandelt sich in so etwas:

*/2 * * * *  /usr/bin/screen -S MyUniqueName -Q select . || /usr/bin/screen -dmS MyUniqueName /bin/bash /path/to/LongRunningScript.bash

Ich mag das, weil es Ihnen auch die Möglichkeit gibt, an ein laufendes Skript anzuhängen und dessen Ausgabe / Status zu überprüfen.

In Ihrem Szenario können Sie cronbeispielsweise vor dem Ausführen eines Builds nach einem anderen Bildschirm suchen

0 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS AutomatedBuild /bin/bash /path/to/BuildScripts.bash
10 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS OtherAutomatedBuild /bin/bash /path/to/OtherBuildScripts.bash

Wenn Sie einen manuellen Build ausführen, springen Sie einfach in einen screenersten, bevor Sie das Skript ausführen (bitte kommentieren Sie, wenn Sie Hinweise zum Verbinden / Trennen benötigen. Dies screenist ein nützliches Dienstprogramm - probieren Sie es aus, wenn Sie es noch nicht verwendet haben).

Typ screen -S ManualBuild, Hit [enter]and Run , was Befehle , die Sie ausführen möchten.

Hinweis: Wenn Sie das mitgelieferte Beispiel verwenden, können Sie verwirren, cronwenn mehr als eine Bildschirmsitzung mit dem Namen "ManualBuild" ausgeführt wird.

trs
quelle
Entschuldigung, ich habe gerade Ihren Hinweis "Über mehrere Benutzer hinweg" gesehen - dies funktioniert nicht ohne Änderungen für Benutzer. Sie müssen überprüfen, ob der Bildschirm die Verbindung zu Sitzungen anderer Benutzer unterstützt.
trs
Das ist eine schöne Idee. Ich würde den Entwicklern die Gewohnheit abnehmen müssen, ihre Laufzeitfenster monatelang offen zu lassen. :)
Sean
Wenn sie ihre Sitzung offen lassen, können Sie sie an einen angehängten Bildschirm anhängen screen -x ScreenNameund abhängig von Ihrer Distribution (suid-Einstellungen für screen) eine Bildschirmsitzung für andere Benutzer freigeben. Am saubersten wäre es, diese Build-Befehle unter einem bestimmten Benutzernamen auszuführen, dem gleichen Benutzer, dem der Cron-Job gehört.
trs