2 Stimmen

sed auf crontab-Zeilen anwenden?

Ich möchte die Uhrzeit, zu der bestimmte Cron-Jobs ausgeführt werden, programmatisch ändern. Ich bin mir nicht sicher, ob ich das richtig angehe, aber hier ist der Plan.

Aufträge, die geändert werden können, werden mit einem Kommentar am Ende der Zeile "#change-enabled" versehen.

15 5 7,14,21,28 * * /path/to/executable1 #change-enabled
15 * * * * /path/to/executable2
45 5 */2 * * /path/to/executable3 #change-enabled

Dann möchte ich die Ausgabe von "crontab -l" durch sed leiten, um Jobs mit diesem Kommentar am Ende zu finden und zu ändern, und die Ergebnisse davon durch "crontab -" leiten.

// Bearbeiten

Mein Bauchgefühl sagt mir, dass ich dies nicht tun sollte, da die neue Stunde anhand von Daten eines Drittanbieters ermittelt wird. (Google Analytics Data Export API) Also ist /etc/cron.d/ etwas, von dem ich mich für diese Anwendung fernhalten werde.

Hier ist der Befehl, der während der Fehlersuche mit allen meinen aktuellen Cron-Jobs funktioniert hat. Ich habe "date +%l" anstelle von "/home/user/slow-hour" verwendet und das "| cron -" weggelassen, um zu sehen, was ich gedruckt bekomme.

crontab -l | sed -e "s/^\([^ ]*\) [0-9]* \(.*#change-enabled\)/\1`/home/user/slow-hour` \2/" | crontab -

Der Inhalt von ~/slow-hour wird ein Skript sein, das stündliche Daten für Website-Profile bei Google Analytics abruft und nach der langsamsten Stunde sucht. Im Falle eines Fehlers, welcher Art auch immer, wird das Skript 1 Uhr morgens zurückgeben, mir eine Benachrichtigung schicken und dann verschwinden.

Um die Wahrscheinlichkeit zu verringern, dass die Ausführung eines Tages übersprungen wird, weil die langsame Stunde vor der aktuellen Stunde liegt, wird der automatische Cron-Rescheduler so eingestellt, dass er um Mitternacht läuft und die früheste Stunde, zu der ~/slow-hour zurückkehrt, 1 Uhr morgens ist.

Auf der Grundlage meiner manuellen Cron-Job-Anpassungen in der Vergangenheit gehe ich nicht davon aus, dass der Ausschluss von Mitternacht als langsamste Stunde in meinem Fall ein Problem darstellt.

3voto

William Pursell Punkte 188248

Crontab -l | sed '/change-enabled$/s/pat/repl/' | crontab -

2voto

viraptor Punkte 32254

Das können Sie tun, aber es gibt einen besseren Weg (vorausgesetzt, Sie haben Root-Zugang).

Anstatt crontab zu ändern, sollten Sie Aufträge in zusammengehörige Gruppen aufteilen. Legen Sie für jede Gruppe eine neue Datei in /etc/cron.d/{jobname} . Auf diese Weise können Sie einfach ein Skript ohne Probleme neu generieren - ohne sed-Zauberei. Teilen Sie alles, was sich ändern kann, in separate Dateien auf, so dass Sie einfach eine neue Datei anstelle der alten schreiben und sich nicht um die Einträge kümmern müssen, die nicht geändert werden müssen.

Der einzige Unterschied ist die Syntax. Anstelle von:

<time> <command>

die Sie dort unterbringen müssen:

<time> <user> <command>

damit der Auftrag mit den richtigen Rechten ausgeführt wird.

Beispiel - anstelle von 'crontab -l | sed -e 's/....somejob.../.../ | crontab ..' just run 'echo .... > /etc/cron.d/somejob '

2voto

Martin v. Löwis Punkte 120025

Angenommen, Sie möchten die Stunde auf 8 setzen, wäre ein Befehl wie folgt

sed -e 's/\([0-9]*\) [0-9]* \(.*#change-enabled\)/\1 8 \2/'

0voto

chaos Punkte 118918
crontab -l | sed -re '/# *change-enabled *$/s/^([^ ]+) [^ ]+/\1 new_hour/' | crontab -

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X