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 is a commonly confusing and misconfigured aspect of the operating system. Technically, cron is just the clock daemon (/usr/sbin/cron or perhaps /usr/sbin/crond) that executes commands at specific times. However, a handful of configuration files and programs go into making up the cron package. Like many system processes, cron never ends. The controlling files for cron are the cron-tables or crontabs. The crontabs are often located in /var/spool/cron/crontab. However, on SuSE you will find them in /var/spool/cron/tabs. The names of the files in this directory are the names of the users that submit the cron jobs.
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.
At first, that might sound a little annoying. However, let's take a look at the process of "adding" a job. To add a cron job, you must first list out the contents of the existing crontab with the -l option. If you are root and wish to add something to another user's crontab, use the -u option followed by the user's logname. Then redirect this crontab to a file, which you can then edit. (Note that on some systems crontab has -e (for "edit"), which will do all the work for you. See the man-page for more 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.
The file /tmp/crontab.uucp now contains the contents of UUCPs crontab. It might look something like this:
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.
To specify different values that are not within a range, separate the individual values by a comma. In the fourth example, the hour field has the two values 10 and 14. This means that the command is run at 10 a.m. and 2 p.m.
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.
It is often useful for root to run jobs as a different user without having to switch users (for example, using the su command). Most Linux dialects provide a mechanism in the form of the /etc/crontab file. This file is typically only writable by root and in some cases, only root can read it (which is often necessary in high security environments). The general syntax is the same as the standard crontabs, with a couple of exceptions.
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 * * * * root rm -f /var/spool/cron/lastrun/cron.hourly
14 0 * * * root rm -f /var/spool/cron/lastrun/cron.daily
29 0 * * 6 root rm -f /var/spool/cron/lastrun/cron.weekly
44 0 1 * * root rm -f /var/spool/cron/lastrun/cron.monthly
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.
The structure of the actual entries is pretty much the same with the exception of the user name (root in each case here). This way, the root users (or whoever can edit /etc/crontab) can define which user executes the command. Keep in mind that this can be a big security hole. If someone can write to this file, they can create an entry that runs as root and therefore has complete control of the system.
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
Another interesting thing about both at and batch is that they create a kind of shell script to execute your command. When you run at or batch, a file is created in /usr/spool/cron/atjobs. This file contains the system variables that you would normally have defined, plus some other information that is contained in /usr/lib/cron.proto. This essentially creates an environment as though you had logged in.
Sagen Sie uns, was aufbleiben muss.
A short conversation with an engineer. No quote-bot, no callback queue. We'll tell you honestly if we're not the right fit.