Gibt es eine Möglichkeit, das Format von / etc / crontab zu validieren?

35

Ich ziehe es vor, geplante Aufgaben in / etc / crontab abzulegen, damit ich auf einen Blick sehen kann, was für eine Ausführung geplant ist, unabhängig davon, unter welchem ​​Benutzer die Aufgabe ausgeführt wird.

Das einzige Problem ist, dass das Format im Gegensatz zu crontab -e beim Speichern nicht validiert wird, sodass ein streunendes Zeichen den gesamten Cron stillschweigend unterbrechen kann.

Gibt es eine Möglichkeit, das Format / etc / crontab vor / nach dem Speichern zu validieren?

Ben K.
quelle
4
Wenn Sie wie ich auf der Suche nach einem einfachen (nicht skriptfähigen) Weg hierher gekommen sind, um festzustellen, ob Ihr Cron-Eintrag richtig ist, könnte Sie cronchecker.net interessieren - ein Online-Validator für Cron-Einträge mit freundliche Ausgabe.
Matt Gibson

Antworten:

17

Die einzige zuverlässige Möglichkeit, die ich gefunden habe, besteht darin, das Protokoll zu überprüfen.

cronprüft /etc/crontabjede Minute und protokolliert eine Meldung, die angibt, dass es neu geladen wurde oder dass es einen Fehler gefunden hat.

Führen Sie nach dem Bearbeiten Folgendes aus:

sleep 60; grep crontab /var/log/syslog | tail

Oder, um nicht eine volle Minute zu warten, sondern nur bis zur nächsten Minute + 5 Sekunden:

sleep $(( 60 - $(date +%S) + 5 )) && grep cron /var/log/syslog | tail

Beispielausgabe mit einem Fehler:

Jan  9 19:10:57 r530a cron[107258]: Error: bad minute; while reading /etc/crontab
Jan  9 19:10:57 r530a cron[107258]: (*system*) ERROR (Syntax error, this crontab file will be ignored)

Gute Leistung:

Jan  9 19:19:01 r530a cron[107258]: (*system*) RELOAD (/etc/crontab)

Das ist auf Debian 8. Auf anderen Systemen loggt sich cron möglicherweise in eine andere Datei.

(Ich dachte, ich könnte es vermeiden, mit systemd's nach der richtigen Protokolldatei zu suchen journalctl -u cron, aber das hat mir diese Protokolleinträge nicht gezeigt und scheint aus irgendeinem Grund vor 2 Tagen die Protokollierung von Cron-Ereignissen eingestellt zu haben.)

mivk
quelle
Getestet unter FreeBSD 10.3. Funktioniert wie ein Zauber, ersetze einfach den Protokollpfad durch / var / log / cron
Jette
14

Eine andere neuere Lösung ist das Python-Skript chkcrontab

Dave Wongillies
quelle
Die Cronjobs der Benutzer werden noch nicht überprüft
userlond
3

Ich fand diese coole Lösung hier: https://crontab.guru

Es validiert nicht nur die Crontab, sondern teilt Ihnen ausdrücklich mit, was und wann die Crontab ausgeführt wird, und zeigt auf, wo Fehler auftreten.

JDS
quelle
0

Auf Ubuntu kann ich anscheinend einfach ausführen:

crontab path/to/crontab/file

HINWEIS: Dies hat den Nebeneffekt, dass dieser Cronjob gestartet wird (danke @NZD)

Wenn die Datei ungültig ist, werde ich einen Fehler wie:

"crontab":11: bad minute
errors in crontab file, can't install.
conradkdotcom
quelle
1
Dieser Befehl überprüft die crontab-Datei, installiert sie jedoch gleichzeitig (sofern sie keine Fehler enthält). Dies ist wahrscheinlich ein unerwünschter Nebeneffekt für das OP.
NZD
Vielen Dank an @NZD, ich habe dies zu meiner Antwort hinzugefügt, um sicherzustellen, dass das OP davon Kenntnis hat.
conradkdotcom
@conradk der befehl startet den cronjob nicht, er überschreibt die vorhandene crontab datei des benutzers mit der angegebenen datei.
MadHatter unterstützt Monica
Dies funktioniert nicht bei allen möglichen Problemen mit der Crontab. es wird einige krasse Probleme auffangen, aber es fängt dies nicht auf, zum Beispiel: * 4/0 * * /bin/myscript.sh - das 4/0ist ungültig. aber nicht von dieser Methode gefangen
JDS
@JDS Ist es nicht ein Schrittwert? Ist ein Schrittwert von 0verboten? unix.stackexchange.com/questions/32027/…
conradkdotcom