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.
quelle
[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?flock
oderrun-one
(Debian / Ubuntu) gesucht ? serverfault.com/questions/82857/…Antworten:
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
flock
Dienstprogramm 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 stop
um dascrond
System herunterzufahren .quelle
flock
Befehl wäre eine schöne Ergänzung zu dieser Antwort. Es behandelt die Sperrdatei und all die kleinen Details, die es gibt.flock
der 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.Ich neige dazu, einfach alle lang laufenden Befehle in einen Bildschirm
cron
zu packen und den Bildschirm nur zu starten, wenn noch keiner ausgeführt wird.Also die folgende Zeile in
crontab
... verwandelt sich in so etwas:
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
cron
beispielsweise vor dem Ausführen eines Builds nach einem anderen Bildschirm suchenWenn Sie einen manuellen Build ausführen, springen Sie einfach in einen
screen
ersten, bevor Sie das Skript ausführen (bitte kommentieren Sie, wenn Sie Hinweise zum Verbinden / Trennen benötigen. Diesscreen
ist 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,
cron
wenn mehr als eine Bildschirmsitzung mit dem Namen "ManualBuild" ausgeführt wird.quelle
screen -x ScreenName
und abhängig von Ihrer Distribution (suid-Einstellungen fürscreen
) 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.