GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie ich Cron unter Linux verwende

Eine der Herausforderungen (unter den vielen Vorteilen), ein Systemadministrator zu sein, besteht darin, Aufgaben auszuführen, wenn Sie lieber schlafen würden. Beispielsweise müssen einige Aufgaben (einschließlich regelmäßig wiederkehrender Aufgaben) über Nacht oder am Wochenende ausgeführt werden, wenn voraussichtlich niemand Computerressourcen verwendet. Abends habe ich keine Zeit, Befehle und Skripte auszuführen, die außerhalb der Geschäftszeiten ausgeführt werden müssen. Und ich möchte nicht um Mitternacht aufstehen müssen, um ein Backup oder ein größeres Update zu starten.

Stattdessen verwende ich zwei Dienstprogramme, mit denen ich Befehle, Programme und Aufgaben zu festgelegten Zeiten ausführen kann. Der cron und bei Dienste ermöglichen es Systemadministratoren, Aufgaben so zu planen, dass sie zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt werden. Der at-Dienst gibt eine einmalige Aufgabe an, die zu einer bestimmten Zeit ausgeführt wird. Der Cron-Dienst kann sich wiederholende Aufgaben planen, z. B. täglich, wöchentlich oder monatlich.

In diesem Artikel stelle ich den Cron-Dienst und seine Verwendung vor.

Häufige (und ungewöhnliche) Verwendung von Cron

Ich benutze den cron Dienst, um offensichtliche Dinge zu planen, wie z. B. regelmäßige Backups, die täglich um 2 Uhr morgens stattfinden. Ich verwende ihn auch für weniger offensichtliche Dinge.

  • Die Systemzeiten (d. h. die Betriebssystemzeit) auf meinen vielen Computern werden mithilfe des Network Time Protocol (NTP) eingestellt. Während NTP die Systemzeit festlegt, stellt es nicht die Hardwarezeit ein, die abweichen kann. Ich verwende cron, um die Hardwarezeit basierend auf der Systemzeit einzustellen.
  • Ich habe auch ein Bash-Programm, das ich jeden Morgen früh starte und das auf jedem Computer eine neue "Nachricht des Tages" (MOTD) erstellt. Es enthält Informationen, wie z. B. die Festplattennutzung, die aktuell sein sollten, um nützlich zu sein.
  • Viele Systemprozesse und -dienste wie Logwatch, logrotate und Rootkit Hunter verwenden den Cron-Dienst, um täglich Aufgaben zu planen und Programme auszuführen.

Der crond Daemon ist der Hintergrunddienst, der die Cron-Funktionalität ermöglicht.

Der Cron-Dienst sucht nach Dateien im Verzeichnis /var/spool/cron und /etc/cron.d Verzeichnisse und die /etc/anacrontab Datei. Der Inhalt dieser Dateien definiert Cron-Jobs, die in verschiedenen Intervallen ausgeführt werden sollen. Die Cron-Dateien der einzelnen Benutzer befinden sich in /var/spool/cron , und Systemdienste und -anwendungen fügen im Allgemeinen Cron-Job-Dateien in /etc/cron.d hinzu Verzeichnis. Die /etc/anacrontab ist ein Sonderfall, der später in diesem Artikel behandelt wird.

crontab verwenden

Das Cron-Dienstprogramm wird basierend auf Befehlen ausgeführt, die in einer Cron-Tabelle (crontab) angegeben sind ). Jeder Nutzer, einschließlich Root, kann eine Cron-Datei haben. Diese Dateien sind standardmäßig nicht vorhanden, können aber im Verzeichnis /var/spool/cron erstellt werden Verzeichnis mit crontab -e Befehl, der auch zum Bearbeiten einer Cron-Datei verwendet wird (siehe Skript unten). Ich empfehle dringend, nicht Verwenden Sie einen Standard-Editor (wie Vi, Vim, Emacs, Nano oder einen der vielen anderen verfügbaren Editoren). Verwenden der crontab Mit dem Befehl können Sie nicht nur den Befehl bearbeiten, sondern auch crond neu starten Daemon, wenn Sie speichern und den Editor verlassen. Die crontab Der Befehl verwendet Vi als zugrunde liegenden Editor, da Vi immer vorhanden ist (selbst bei den einfachsten Installationen).

Neue Cron-Dateien sind leer, daher müssen Befehle von Grund auf neu hinzugefügt werden. Ich habe das folgende Job-Definitionsbeispiel zu meinen eigenen Cron-Dateien hinzugefügt, nur als kurze Referenz, damit ich weiß, was die verschiedenen Teile eines Befehls bedeuten. Fühlen Sie sich frei, es für Ihren eigenen Gebrauch zu kopieren.

# crontab -e
SHELL=/bin/bash
[email protected]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# backup using the rsbu program to the internal 4TB HDD and then 4TB external
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

# Set the hardware clock to keep it in sync with the more accurate system clock
03 05 * * * /sbin/hwclock --systohc

# Perform monthly updates on the first of the month
# 25 04 1 * * /usr/bin/dnf -y update

Die ersten drei Zeilen im obigen Code richten eine Standardumgebung ein. Die Umgebung muss so eingestellt werden, wie es für einen bestimmten Benutzer erforderlich ist, da cron keinerlei Umgebung bereitstellt. Die SCHALE Die Variable gibt die Shell an, die verwendet werden soll, wenn Befehle ausgeführt werden. Dieses Beispiel gibt die Bash-Shell an. Die MAILTO Die Variable legt die E-Mail-Adresse fest, an die Cron-Job-Ergebnisse gesendet werden. Diese E-Mails können den Status des Cron-Jobs (Backups, Updates usw.) angeben und bestehen aus der Ausgabe, die Sie sehen würden, wenn Sie das Programm manuell über die Befehlszeile ausführen würden. Die dritte Zeile richtet den PATH ein Für die Umwelt. Obwohl der Pfad hier festgelegt ist, stelle ich jeder ausführbaren Datei immer den vollständig qualifizierten Pfad voran.

Im obigen Beispiel gibt es mehrere Kommentarzeilen, die die zum Definieren eines Cron-Jobs erforderliche Syntax beschreiben. Ich werde diese Befehle aufschlüsseln und dann ein paar weitere hinzufügen, um Ihnen einige erweiterte Funktionen von crontab-Dateien zu zeigen.

01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

Diese Zeile führt mein selbst geschriebenes Bash-Shell-Skript rsbu aus , das alle meine Systeme sichert. Dieser Job beginnt jeden Tag um 01:01 Uhr (01 01). Die Sternchen (*) an den Positionen drei, vier und fünf der Zeitangabe sind wie Datei-Globs oder Platzhalter für andere Zeiteinteilungen; sie spezifizieren „jeden Tag des Monats“, „jeden Monat“ und „jeden Tag der Woche“. Diese Zeile führt meine Backups zweimal aus; eine sichert auf einer internen dedizierten Sicherungsfestplatte und die andere auf einem externen USB-Laufwerk, das ich in den Safe mitnehmen kann.

Die folgende Zeile stellt die Hardwareuhr auf dem Computer unter Verwendung der Systemuhr als Quelle einer genauen Zeit ein. Diese Linie soll jeden Tag um 5:03 Uhr (03 05) fahren.

03 05 * * * /sbin/hwclock --systohc

Ich habe den dritten und letzten Cron-Job (auskommentiert) verwendet, um einen dnf auszuführen oder lecker Aktualisierung um 04:25 Uhr am ersten Tag jedes Monats, aber ich habe es auskommentiert, sodass es nicht mehr ausgeführt wird.

# 25 04 1 * * /usr/bin/dnf -y update

Andere Planungstricks

Lassen Sie uns nun einige Dinge tun, die ein wenig interessanter sind als diese Grundlagen. Angenommen, Sie möchten jeden Donnerstag um 15:00 Uhr einen bestimmten Job ausführen:

00 15 * * Thu /usr/local/bin/mycronjob.sh

Oder vielleicht müssen Sie vierteljährliche Berichte nach dem Ende jedes Quartals erstellen. Der Cron-Dienst hat keine Option für „Der letzte Tag des Monats“, daher können Sie stattdessen den ersten Tag des folgenden Monats verwenden, wie unten gezeigt. (Dabei wird davon ausgegangen, dass die für die Berichte erforderlichen Daten bereit sind, wenn der Job ausgeführt wird.)

02 03 1 1,4,7,10 * /usr/local/bin/reports.sh

Das folgende Beispiel zeigt einen Job, der zwischen 9:01 Uhr und 17:01 Uhr stündlich eine Minute nach der letzten Stunde ausgeführt wird.

01 09-17 * * * /usr/local/bin/hourlyreminder.sh

Ich bin auf Situationen gestoßen, in denen ich alle zwei, drei oder vier Stunden einen Job ausführen musste. Dies kann erreicht werden, indem die Stunden durch das gewünschte Intervall geteilt werden, z. B. */3 für alle drei Stunden, oder 6-18/3 zwischen 6:00 und 18:00 Uhr alle drei Stunden zu fahren. Andere Intervalle können ähnlich unterteilt werden; zum Beispiel der Ausdruck */15 in der Minutenposition bedeutet "Job alle 15 Minuten ausführen."

*/5 08-18/2 * * * /usr/local/bin/mycronjob.sh

Beachten Sie Folgendes:Die Divisionsausdrücke müssen einen Rest von Null ergeben, damit der Job ausgeführt werden kann. Aus diesem Grund wird der Job in diesem Beispiel so eingestellt, dass er alle fünf Minuten (08:05, 08:10, 08:15 usw.) während der geraden Stunden von 8:00 bis 18:00 Uhr ausgeführt wird, aber nicht während der ungeraden. nummerierte Stunden. Beispielsweise wird der Job ab 21:00 Uhr gar nicht ausgeführt. bis 9:59 Uhr

Ich bin sicher, dass Ihnen anhand dieser Beispiele viele andere Möglichkeiten einfallen werden.

Einschränken des Cron-Zugriffs

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Normale Nutzer mit Cron-Zugriff könnten Fehler machen, die beispielsweise dazu führen könnten, dass Systemressourcen (wie Arbeitsspeicher und CPU-Zeit) überlastet werden. Um möglichen Missbrauch zu verhindern, kann der Systemadministrator den Benutzerzugriff einschränken, indem er eine /etc/cron.allow erstellt Datei, die eine Liste aller Nutzer mit der Berechtigung zum Erstellen von Cronjobs enthält. Der Root-Benutzer kann nicht daran gehindert werden, cron zu verwenden.

Indem verhindert wird, dass Nicht-Root-Benutzer ihre eigenen Cron-Jobs erstellen, kann es für Root erforderlich sein, ihre Cron-Jobs zur Root-Crontab hinzuzufügen. "Aber warte!" du sagst. "Läuft das diese Jobs nicht als root aus?" Nicht unbedingt. Im ersten Beispiel in diesem Artikel kann das in den Kommentaren angezeigte Feld username verwendet werden, um die Benutzer-ID anzugeben, die ein Job haben soll, wenn er ausgeführt wird. Dadurch wird verhindert, dass die Jobs des angegebenen Nicht-Root-Benutzers als Root ausgeführt werden. Das folgende Beispiel zeigt eine Jobdefinition, die einen Job als Benutzer „Student“ ausführt:

04 07 * * * student /usr/local/bin/mycronjob.sh

Wenn kein Benutzer angegeben ist, wird der Job als der Benutzer ausgeführt, der die Crontab-Datei besitzt, in diesem Fall root.

cron.d

Das Verzeichnis /etc/cron.d Hier installieren einige Anwendungen wie SpamAssassin und sysstat Cron-Dateien. Da es keinen spamassassin- oder sysstat-Benutzer gibt, benötigen diese Programme einen Ort, um Cron-Dateien zu finden, also werden sie in /etc/cron.d abgelegt .

Die /etc/cron.d/sysstat Die folgende Datei enthält Cron-Jobs, die sich auf Systemaktivitätsberichte (SAR) beziehen. Diese Cron-Dateien haben das gleiche Format wie eine Benutzer-Cron-Datei.

# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

Die Cron-Datei sysstat hat zwei Zeilen, die Aufgaben ausführen. Die erste Zeile führt die sa1 Programm alle 10 Minuten, um Daten zu sammeln, die in speziellen Binärdateien im Verzeichnis /var/log/sa gespeichert sind Verzeichnis. Dann, jede Nacht um 23:53 Uhr, die sa2 Programm wird ausgeführt, um eine tägliche Zusammenfassung zu erstellen.

Planungstipps

Einige der Zeiten, die ich in den crontab-Dateien einstelle, scheinen eher zufällig zu sein – und in gewissem Maße sind sie es auch. Der Versuch, Cron-Jobs zu planen, kann eine Herausforderung sein, insbesondere wenn die Anzahl der Jobs zunimmt. Normalerweise muss ich auf jedem meiner Computer nur wenige Aufgaben planen, was einfacher ist als in einigen Produktions- und Laborumgebungen, in denen ich gearbeitet habe.

Ein System, das ich verwaltete, hatte etwa ein Dutzend Cron-Jobs, die jede Nacht liefen, und weitere drei oder vier, die am Wochenende oder am Ersten des Monats liefen. Das war eine Herausforderung, denn wenn zu viele Jobs gleichzeitig liefen – insbesondere die Sicherungen und Kompilierungen –, ging dem System der Arbeitsspeicher aus und die Auslagerungsdatei füllte sich fast, was zu einem Zusammenbruch des Systems führte, während die Leistung nachließ, sodass nichts getan wurde. Wir haben mehr Arbeitsspeicher hinzugefügt und die Planung von Aufgaben verbessert. Wir haben auch eine Aufgabe entfernt, die sehr schlecht geschrieben war und viel Speicher beanspruchte.

Der Crond-Dienst geht davon aus, dass der Host-Computer die ganze Zeit läuft. Das heißt, wenn der Computer während eines Zeitraums ausgeschaltet wird, in dem Cron-Jobs geplant waren, werden sie nicht ausgeführt, bis sie das nächste Mal geplant sind. Dies kann zu Problemen führen, wenn es sich um kritische Cron-Jobs handelt. Glücklicherweise gibt es eine weitere Möglichkeit, Jobs in regelmäßigen Abständen auszuführen:anacron .

Anacron

Das anacron-Programm führt die gleiche Funktion wie crond aus, fügt jedoch die Möglichkeit hinzu, Jobs auszuführen, die übersprungen wurden, beispielsweise wenn der Computer ausgeschaltet war oder den Job aus anderen Gründen für einen oder mehrere Zyklen nicht ausführen konnte. Dies ist sehr nützlich für Laptops und andere Computer, die ausgeschaltet oder in den Energiesparmodus versetzt werden.

Sobald der Computer eingeschaltet und hochgefahren wird, prüft anacron, ob konfigurierte Jobs ihre letzte geplante Ausführung verpasst haben. Wenn dies der Fall ist, werden diese Jobs sofort ausgeführt, jedoch nur einmal (unabhängig davon, wie viele Zyklen verpasst wurden). Wenn beispielsweise ein wöchentlicher Job drei Wochen lang nicht ausgeführt wurde, weil das System während Ihres Urlaubs heruntergefahren war, wurde er kurz nach dem Einschalten des Computers ausgeführt, aber nur einmal, nicht dreimal.

Das anacron-Programm bietet einige einfache Optionen zum Ausführen regelmäßig geplanter Aufgaben. Installieren Sie einfach Ihre Skripte in /etc/cron.[hourly|daily|weekly|monthly] Verzeichnisse, je nachdem, wie oft sie ausgeführt werden müssen.

Wie funktioniert das? Die Sequenz ist einfacher, als es zunächst den Anschein hat.

  1. Der Crond-Dienst führt den in /etc/cron.d/0hourly angegebenen Cron-Job aus .
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

  1. Der in /etc/cron.d/0hourly angegebene Cron-Job führt die run-parts aus Programm einmal pro Stunde.
  2. Die Run-Teile Programm führt alle Skripte aus, die sich in /etc/cron.hourly befinden Verzeichnis.
  3. Die /etc/cron.hourly Verzeichnis enthält das 0anacron -Skript, das das Anacron-Programm unter Verwendung von /etdc/anacrontab ausführt hier gezeigte Konfigurationsdatei.
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
                                                               
#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

  1. Das anacron-Programm führt die Programme aus, die sich in /etc/cron.daily befinden einmal am Tag; es führt die Jobs aus, die sich in /etc/cron.weekly befinden einmal pro Woche und die Jobs in cron.monthly ein Mal per Monat. Beachten Sie die angegebenen Verzögerungszeiten in jeder Zeile, die verhindern, dass sich diese Jobs mit sich selbst und anderen Cronjobs überschneiden.

Anstatt komplette Bash-Programme in der cron.X abzulegen Verzeichnisse, installiere ich sie im /usr/local/bin Verzeichnis, was es mir ermöglicht, sie einfach von der Befehlszeile aus auszuführen. Dann füge ich einen Symlink im entsprechenden Cron-Verzeichnis hinzu, z. B. /etc/cron.daily .

Das anacron-Programm ist nicht darauf ausgelegt, Programme zu bestimmten Zeiten auszuführen. Es ist vielmehr beabsichtigt, Programme in Intervallen auszuführen, die zu den angegebenen Zeiten beginnen, z. B. 3 Uhr morgens (siehe START_HOURS_RANGE Zeile im Skript oben) an jedem Tag, am Sonntag (zu Beginn der Woche) und am ersten Tag des Monats. Wenn ein oder mehrere Zyklen ausgelassen werden, führt anacron die ausgelassenen Jobs sobald wie möglich einmal aus.

Kurzbefehle

Die /etc/anacrontab Die oben gezeigte Datei zeigt uns einen Hinweis darauf, wie wir Verknüpfungen für einige bestimmte und häufige Zeiten verwenden können. Diese aus einem Wort bestehenden Abkürzungen für Zeitangaben können verwendet werden, um die fünf Felder zu ersetzen, die normalerweise zur Angabe von Zeiten verwendet werden. Das @ Zeichen wird verwendet, um Verknüpfungen zu cron zu identifizieren. Die folgende Liste, die der Manpage crontab(5) entnommen ist, zeigt die Abkürzungen mit ihren äquivalenten Bedeutungen.

  • @reboot :Nach dem Neustart einmal ausführen.
  • @yearly :Einmal im Jahr ausführen, dh. 0 0 1 1 *
  • @annually :Einmal im Jahr ausführen, dh. 0 0 1 1 *
  • @monthly :Einmal im Monat ausführen, dh. 0 0 1 * *
  • @weekly :Einmal pro Woche ausführen, dh. 0 0 * * 0
  • @daily :Einmal täglich ausführen, dh. 0 0 * * *
  • @hourly :Einmal pro Stunde ausführen, dh. 0 * * * *

Diese Verknüpfungen können in allen crontab-Dateien verwendet werden, beispielsweise in /etc/cron.d .

Mehr zum Festlegen von Limits

Ich verwende die meisten dieser Methoden zum Planen von Aufgaben, die auf meinen Computern ausgeführt werden sollen. All diese Aufgaben müssen mit Root-Rechten ausgeführt werden. Meiner Erfahrung nach ist es selten, dass normale Benutzer wirklich einen Cron-Job benötigen. Ein Fall war ein Entwicklerbenutzer, der einen Cron-Job benötigte, um eine tägliche Kompilierung in einem Entwicklungslabor zu starten.

Es ist wichtig, den Zugriff auf Cron-Funktionen durch Nicht-Root-Benutzer einzuschränken. Es gibt jedoch Umstände, unter denen ein Benutzer eine Aufgabe so einstellen muss, dass sie zu vordefinierten Zeiten ausgeführt wird, und cron kann ihm dies erlauben. Viele Benutzer verstehen nicht, wie diese Aufgaben mit Cron richtig konfiguriert werden, und sie machen Fehler. Diese Fehler mögen harmlos sein, aber meistens können sie Probleme verursachen. Durch das Festlegen von funktionalen Richtlinien, die dazu führen, dass Benutzer mit dem Systemadministrator interagieren, ist es viel weniger wahrscheinlich, dass einzelne Cron-Jobs andere Benutzer und andere Systemfunktionen stören.

Es ist möglich, die Gesamtressourcen zu begrenzen, die einzelnen Benutzern oder Gruppen zugewiesen werden können, aber das ist ein anderer Artikel.

Für weitere Informationen bieten die Manpages für cron, crontab, anacron, anacrontab und run-parts hervorragende Informationen und Beschreibungen, wie das cron-System funktioniert.

Dieser Artikel wurde ursprünglich im November 2017 veröffentlicht und um zusätzliche Informationen erweitert.


Linux
  1. So verwenden Sie BusyBox unter Linux

  2. So verwenden Sie Cron unter Linux

  3. So verwenden Sie FIND unter Linux

  4. So verwenden Sie Unzip unter Linux

  5. So verwenden Sie den Su-Befehl unter Linux

So verwenden Sie den Linux-Bildschirm

Wie man Cron-Jobs unter Linux auflistet

So verwenden Sie du Command unter Linux

So verwenden Sie das Linux-Terminal in Android

So verwenden Sie den Befehl sysctl unter Linux

So verwenden Sie den Befehl zum Herunterfahren von Linux