KENNTNISSE · LINUX
Cron Jobs Konfiguration
Zuletzt aktualisiert 2020-01-18
Bitte prüfen Sie, ob Sie ein gültiges E-Mail-Konto haben, um die E-Mails zu erhalten. Bitte lesen Sie den folgenden Artikel über 'Cron Jobs Konfiguration' und wenn Sie noch Hilfe benötigen, erheben Sie ein Support-Ticket.
Cron ist ein häufig verwirrender und falsch konfigurierter Aspekt des Betriebssystems. Technisch gesehen ist cron nur der Clock-Daemon (/usr/sbin/cron oder vielleicht /usr/sbin/crond), der Befehle zu bestimmten Zeiten ausführt. Eine Handvoll Konfigurationsdateien und Programme fließen jedoch in die Erstellung des Cron-Pakets ein. Wie viele Systemprozesse endet cron nie. Die Kontrolldateien für cron sind die cron-Tabs oder crontabs. Die Crontabs befinden sich oft in /var/spool/cron/crontab. Auf SuSE finden Sie sie jedoch in /var/spool/cron/tabs. Die Namen der Dateien in diesem Verzeichnis sind die Namen der Benutzer, die die Cron-Jobs einreichen.
Im Gegensatz zu anderen UNIX-Dialekten schläft der Linux-Cron-Daemon erst, wenn der nächste Cron-Job fertig ist. Wenn cron stattdessen einen job erledigt, überprüft er immer wieder einmal pro minute, ob mehr jobs ausgeführt werden. Außerdem sollten Sie die Dateien nicht direkt bearbeiten. Sie können sie mit einem Texteditor wie vi bearbeiten, obwohl es das Potenzial gibt, Dinge zu vermasseln. Daher sollten Sie das Tool verwenden, das Linux zur Verfügung stellt: crontab. (Siehe die Man-Seite für weitere Details)
Das Crontab-Dienstprogramm hat mehrere Funktionen. Es ist das Mittel, mit dem Dateien, die die Cron-Jobs enthalten, an das System übermittelt werden. Zweitens kann es den Inhalt Ihres Crontabs auflisten. Wenn Sie root sind, kann es auch Jobs für jeden Benutzer einreichen und auflisten. Das Problem ist, dass Arbeitsplätze nicht individuell eingereicht werden können. Mit crontab müssen Sie alle Jobs gleichzeitig einreichen.
Das klingt zunächst vielleicht etwas ärgerlich. Werfen wir jedoch einen Blick auf den Prozess des "Hinzufügens" eines Jobs. Um einen Cron-Job hinzuzufügen, müssen Sie zunächst den Inhalt des vorhandenen Crontabs mit der Option -l auflisten. Wenn Sie root sind und etwas zum Crontab eines anderen Benutzers hinzufügen möchten, verwenden Sie die Option -u gefolgt vom Lognamen des Benutzers. Dann leiten Sie dieses Crontab zu einer Datei um, die Sie dann bearbeiten können. (Beachten Sie, dass crontab auf einigen Systemen -e (für "Bearbeiten") hat, was die ganze Arbeit für Sie erledigt. Siehe die Man-Seite für weitere Details.
Nehmen wir zum Beispiel an, dass Sie der Root-Benutzer sind und etwas zum Crontab des UUCP-Benutzers hinzufügen möchten. Holen Sie sich zunächst die Ausgabe des vorhandenen crontab-Eintrags mit diesem Befehl:
crontab -l -u uucp >/tmp/crontab.uucp
Um einen Eintrag hinzuzufügen, fügen Sie einfach eine neue Zeile hinzu. Speichern Sie die Datei, verlassen Sie Ihren Editor und führen Sie das Crontab-Dienstprogramm erneut aus. Diesmal lassen Sie das -l weg, um die Datei aufzulisten, aber geben Sie den Namen der Datei an. Das crontab-Dienstprogramm kann auch Eingaben von stdin akzeptieren, so dass Sie den Dateinamen weglassen können und crontab Ihnen die Eingabe der cronjobs in der Befehlszeile ermöglicht. Beachten Sie, dass alle vorherigen crontab entfernt wird, egal welche Methode Sie verwenden.
Die Datei /tmp/crontab.uucp enthält nun den Inhalt von UUCPs crontab. Es könnte ungefähr so aussehen:
39,9 * * * * /usr/lib/uucp/uudemon.hour > /dev/null
10 * * * * /usr/lib/uucp/uudemon.poll > /dev/null
45 23 * * * ulimit 5000; /usr/lib/uucp/uudemon.clean > /dev/null
48 10,14 * * 1-5 /usr/lib/uucp/uudemon.admin > /dev/null
Trotz seines Aussehens besteht jeder Crontab-Eintrag aus nur sechs Feldern. Die ersten fünf stellen die Zeit dar, zu der der Job ausgeführt werden soll, und die sechste ist der eigentliche Befehl. Die ersten fünf Felder sind entweder durch ein Leerzeichen oder einen Tab getrennt und repräsentieren die folgenden Einheiten:
Minuten (0-59)
Stunde (0-23)
Tag des Monats (1-31)
Monat des Jahres (1-12)
Wochentag (0-6, 0=Sonntag)
Um alle möglichen Werte anzugeben, verwenden Sie ein Sternchen (*). Sie können einen einzelnen Wert angeben, indem Sie diesen einen Wert einfach einschließen. Beispielsweise hat die zweite Zeile im vorherigen Beispiel einen Wert von 10 im ersten Feld, was 10 Minuten nach der Stunde bedeutet. Da alle anderen vier Zeitfelder Sternchen sind, bedeutet dies, dass der Befehl jede Stunde eines jeden Tages um 10 Minuten nach der Stunde ausgeführt wird.
Wertebereiche setzen sich aus dem ersten Wert, einem Bindestrich und dem Endwert zusammen. Zum Beispiel hat die vierte Zeile einen Bereich (1-5) am Tag der Woche Spalte, was bedeutet, dass der Befehl nur an den Tagen 1-5, Montag bis Freitag ausgeführt wird.
Um verschiedene Werte anzugeben, die nicht innerhalb eines Bereichs liegen, trennen Sie die einzelnen Werte durch ein Komma. Im vierten Beispiel hat das Stundenfeld die beiden Werte 10 und 14. Das bedeutet, dass der Befehl um 10 Uhr und 14 Uhr ausgeführt wird.
Beachten Sie, dass die Zeiten additiv sind. Schauen wir uns ein Beispiel an:
10 * 1,16 * 1-5 /usr/local/bin/command
Der Befehl wird 10 Minuten nach jeder Stunde am ersten und sechzehnten sowie Montag bis Freitag ausgeführt. Wenn entweder der erste oder der sechzehnte an einem Wochenende waren, würde der Befehl immer noch laufen, weil der Tag des Monats Feld gelten würde. Dies bedeutet jedoch nicht, dass, wenn der erste Montag ist, der Befehl zweimal ausgeführt wird.
Der Crontab-Eintrag kann so definiert werden, dass er in verschiedenen Intervallen als nur jede Stunde oder jeden Tag läuft. Die Granularität kann alle zwei Minuten oder alle drei Stunden angegeben werden, ohne dass jeder einzelne Eintrag in die Crontab eingefügt werden muss.
Nehmen wir an, wir wollten den vorherigen Befehl nicht 10 Minuten nach der Stunde ausführen, sondern alle zehn Minuten. Wir könnten einen Eintrag machen, der so aussah.:
0,10,20,30,40,50 * 1,16 * 1-5 /usr/local/bin/command
Das läuft alle 10 Minuten: am Ende der Stunde, 10 Minuten danach, 20 Minuten danach und so weiter. Um das Leben einfacher zu machen, könnten wir einfach den Eintrag so erstellen:
*/10 * 1,16 * 1-5 /usr/local/bin/command
Diese Syntax kann für einige Administratoren neu sein. (Es war für mich.) Der Schrägstrich (/) sagt, dass innerhalb des spezifischen Intervalls (in diesem Fall jede Minute) der Befehl alle so viele Minuten ausgeführt wird; in diesem Fall alle 10 Minuten.
Wir können dies auch verwenden, wenn wir einen Bereich angeben. Wenn der Job beispielsweise nur zwischen 20 Minuten nach der Stunde und 40 Minuten nach der Stunde laufen sollte, könnte der Eintrag so aussehen:
20-40 * 1,16 * 1-5 /usr/local/bin/command
Was wäre, wenn Sie wollten, dass es zu diesen Zeiten läuft, aber nur alle drei Minuten? Die Linie könnte so aussehen:
20-40/3 * 1,16 * 1-5 /usr/local/bin/command
Um die Dinge noch komplizierter zu machen, könnten Sie sagen, dass Sie wollten, dass der Befehl alle zwei Minuten zwischen der Stunde und 20 Minuten danach, alle drei Minuten zwischen 20 und 40 Minuten danach, dann alle 5 Minuten zwischen 40 Minuten danach und der Stunde läuft.
0-20/2,21-40/3,41-59/5 * 1,16 * 1-5 /usr/local/bin/command
Eine wirklich nette Sache, die viele Linux-Dialekte tun, ist, dass Sie Abkürzungen für die Tage der Woche und die Monate angeben können. Es ist viel einfacher, sich daran zu erinnern, dass Fri für Freitag statt für 5 ist.
Mit Ausnahme bestimmter Fehler in den Zeitfeldern werden Fehler erst gemeldet, wenn cron den Befehl ausführt. Alle Fehlermeldungen und -ausgabe werden an die Benutzer gesendet. Zumindest ist das, was die crontab man-page sagt und das ist im Grunde wahr. Wie Sie jedoch in den vorherigen Beispielen sehen, leiten Sie stdout zu /dev/null um. Wenn Sie wollten, könnten Sie auch Stderr dorthin umleiten und Sie würden nie sehen, ob es irgendwelche Fehler gab.
Die Ausgabe wird an den Benutzer gesendet, da es kein echtes Terminal gibt, auf dem die Cronjobs ausgeführt werden. Daher gibt es keinen Bildschirm, um die Fehler anzuzeigen. Es gibt auch keine Tastatur, um Eingaben zu akzeptieren. Bedeutet das, dass Sie keinen Input zu einem Cron-Job geben können? Nein. Denken Sie an die Diskussion über Shell-Skripte zurück. Wir können Stdin, Stdout und Stderr neu definieren. Auf diese Weise können sie alle auf Dateien zeigen und sich so verhalten, wie wir es erwarten.
Eine Sache, auf die ich hinweisen möchte, ist, dass ich nicht dafür plädiere, im Befehlsfeld des Crontabs eine Umleitung vorzunehmen. Ich mache dort gerne so wenig wie möglich. Stattdessen habe ich den absoluten Pfad zu einem Shell-Skript gesetzt. Ich kann dann den crontab-eintrag mit etwas einfachem testen. Sobald das funktioniert, kann ich Änderungen am Shell-Skript vornehmen, ohne den Cronjob erneut einreichen zu müssen.
Denken Sie daran, dass Cron nicht genau ist. Es synchronisiert sich selbst mit dem oberen Teil jeder Minute. Auf einem ausgelasteten System, in dem Sie Ticks verlieren, werden Jobs möglicherweise erst einige Minuten nach der geplanten Zeit ausgeführt. Darüber hinaus kann es andere Prozesse mit höheren Prioritäten geben, die Cron-Jobs verzögern. In einigen Fällen (insbesondere bei sehr beschäftigten Systemen) können Jobs übersprungen werden, wenn sie jede Minute ausgeführt werden.
Der Zugriff auf die Cron-Einrichtung ist über zwei Dateien, beide in /etc, erlaubt. Wenn Sie eine Datei cron.allow haben, können Sie angeben, welche Benutzer cron verwenden dürfen. Die cron.deny sagt, wer speziell nicht cron verwenden darf. Wenn keine der beiden Dateien existiert, haben nur die Systembenutzer Zugriff. Wenn Sie jedoch möchten, dass jeder Zugriff hat, erstellen Sie eine Eintragsdatei cron.deny. Mit anderen Worten, niemandem wird der Zugang verweigert.
Es ist oft nützlich, dass root Jobs als anderer Benutzer ausführt, ohne dass der Benutzer gewechselt werden muss (z. B. mit dem Befehl su). Die meisten Linux-Dialekte bieten einen Mechanismus in Form der /etc/crontab-Datei. Diese Datei ist in der Regel nur durch root beschreibbar und in einigen Fällen kann nur root sie lesen (was in Hochsicherheitsumgebungen oft erforderlich ist). Die allgemeine Syntax ist die gleiche wie die Standard-Crontabs, mit ein paar Ausnahmen.
Der erste Unterschied ist der Header, den Sie hier sehen können:
SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root
#
# Check-Scripts in cron.hourly, cron.daily, cron.weekly und cron.monthly
#
59 * * * * Wurzel rm -f /var/spool/cron/lastrun/cron.hourly
14 0 * * * Wurzel rm -f /var/spool/cron/lastrun/cron.daily
29 0 * * 6 Wurzel rm -f /var/spool/cron/lastrun/cron.weekly
44 0 1 * * Wurzel rm -f /var/Spool/cron/lastrun/cron.monatlich
Die SHELL-Variable definiert die Shell, unter der jeder Befehl ausgeführt wird. Die PATH-Variable ist wie die normale PATH-Umgebungsvariable und definiert den Suchpfad. Die MAILTO-Variable sagt, wer E-Mail-Nachrichten erhalten soll, die Fehlermeldungen und die Standardausgabe der ausgeführte Befehle.
Die Struktur der eigentlichen Einträge ist mit Ausnahme des Benutzernamens (root jeweils hier) ziemlich gleich. Auf diese Weise können die Root-Benutzer (oder wer auch immer /etc/crontab bearbeiten kann) definieren, welcher Benutzer den Befehl ausführt. Denken Sie daran, dass dies eine große Sicherheitslücke sein kann. Wenn jemand in diese Datei schreiben kann, kann er einen Eintrag erstellen, der als root ausgeführt wird und somit die vollständige Kontrolle über das System hat.
Der nächste Befehl in der cron "Suite" ist at. Seine Funktion ist einen Befehl zu einem bestimmten Zeitpunkt auszuführen. Der Unterschied ist, dass, sobald der Job ausgeführt wurde, er aus dem System verschwindet. Was cron betrifft, so haben zwei Dateien, at.allow und at.deny, die gleiche Wirkung auf das at-Programm.
Der Batch-Befehl wird auch verwendet, um Befehle einmal auszuführen. Befehle, die mit Batch eingereicht werden, werden jedoch ausgeführt, wenn das System zu ihm kommt, was bedeutet, wenn das System weniger beschäftigt ist, zum Beispiel mitten in der Nacht. Es ist möglich, dass solche Jobs über den ganzen Tag verteilt sind, abhängig von der Belastung des Systems.
Eine Sache zu beachten ist das Verhalten von at und batch. Beide akzeptieren die Namen der Befehle aus der Befehlszeile und nicht als Argumente für den Befehl selbst. Sie müssen zuerst den Befehl ausführen, um in eine neue Zeile gebracht zu werden, in der Sie die Befehle eingeben, die Sie ausführen möchten. Nach jedem Befehl drücken Sie Enter. Wenn Sie fertig sind, drücken Sie Strg-D.
Da diese beiden Befehle Befehle von stdin akzeptieren, können Sie den Befehl eingeben, ohne dies jedes Mal in einer neuen Zeile tun zu müssen. Eine Möglichkeit ist um Eingaben aus einer Datei umzuleiten. Zum Beispiel
jetzt +1 Stunde < command list
wobei command list eine Datei ist, die eine Liste von Befehlen enthält. Sie können auch an (oder Batch) als Ende einer Pfeife haben
cat command list | jetzt + 1 Stunde
cat command list | batch
Eine weitere interessante Sache über beide at und Batch ist, dass sie eine Art Shell-Skript erstellen, um Ihren Befehl auszuführen. Wenn Sie bei oder Batch ausführen, wird eine Datei in /usr/spool/cron/atjobs erstellt. Diese Datei enthält die Systemvariablen, die Sie normalerweise definiert hätten, sowie einige andere Informationen, die in /usr/lib/cron.proto enthalten sind. Dies schafft im Wesentlichen eine Umgebung, als ob Sie sich angemeldet hätten.
Sagen Sie uns, was aufbleiben muss.
Ein kurzes Gespräch mit einem Ingenieur. Kein quote-bot, keine callback-warteschlange.