5 Crontab-Beispiele zur Automatisierung von Linux-Aufgaben

Das Programm cron automatisiert die Ausführung anderer Programme unter Linux. Cron ist ein Daemon, der kontinuierlich läuft und andere Programme nach einem vorgegebenen Zeitplan startet. Mehrere verschiedene Dateien definieren diesen Zeitplan. Sie werden einzeln als Crontabs bezeichnet.

Cron kann jeden Unix-Befehl oder jede Task planen. Manchmal möchten Sie mit einem einfachen Befehl arbeiten. In anderen Fällen müssen Sie ein Skript schreiben, um die gesamte Aufgabe auszuführen. Cron funktioniert mit beiden Ansätzen einwandfrei. Es unterstützt auch komplizierte Planungsregeln und flexible Möglichkeiten, mit der Skriptausgabe umzugehen.

Ob einfache Benutzeraufgaben oder umfassende Systemadministration, das Verständnis der Funktionsweise von cron anhand praktischer Beispiele ist ein Muss.

1. Bereinigen von /tmp mit einer systemweiten Crontab

Das Verzeichnis /tmp ist ein temporärer Speicherort zur allgemeinen Verwendung durch jedes Programm oder Systembenutzer. Viele Unix-Systeme löschen beim Start alte Dateien im Verzeichnis /tmp. Andere planen diesen Vorgang und verwenden häufig cron.

Wenn Sie jedoch eine benutzerdefinierte Kontrolle über diesen Prozess wünschen oder ihn auf ein anderes Verzeichnis anwenden möchten, ist das Einrichten einer schnellen Cron-Aufgabe eine einfache Möglichkeit.

So können Sie /tmp oder ein anderes Verzeichnis Ihrer Wahl bereinigen:

 1 3 * * * /usr/bin/find /tmp -type f -atime +10 -delete

Jeden Tag um eine Minute nach drei führt cron diesen Befehl aus. Es verwendet den Befehl find , um nach Dateien im Verzeichnis /tmp zu suchen. Es filtert alles außer normalen Dateien heraus, die vor mindestens 10 Tagen zuletzt geändert wurden. Es entfernt dann alle gefundenen Dateien.

Sie sollten einen solchen Befehl zu einer globalen crontab wie /etc/crontab oder der crontab von root hinzufügen, indem Sie sudo crontab -e verwenden . Der Befehl muss als Root ausgeführt werden, damit er Dateien in /tmp löschen kann, unabhängig davon, wem sie gehören.

Beachten Sie, dass dieses Beispiel den vollständigen Pfad zum Befehl find angibt. Cron verwendet eine grundlegende PATH-Einstellung , um nach ausführbaren Dateien zu suchen. Wenn sich der Befehl also an einem Standardort befindet (wie /usr/bin ), ist dies nicht wirklich notwendig. Sie können einen alternativen PATH in der crontab selbst angeben, wenn Sie diesen Ansatz bevorzugen. Die Verwendung eines vollständigen Pfads für Befehle ist jedoch etwas robuster.

Wenn Sie an einem Projekt arbeiten, das Protokolle schreibt oder zwischengespeicherte Daten speichert, kann dieser Ansatz entscheidend sein, wenn Sie Dateien löschen, um Speicherplatz freizugeben. Während das obige Beispiel ein schneller Ansatz ist, sollten Sie einen Befehl wie tmpwatch verwenden , falls dieser verfügbar ist.

2. Datenbanksicherungen zweimal täglich

Konzentrieren wir uns von nun an auf benutzerspezifische Aufgaben, die Sie über Ihre lokale Crontab verwalten können. Sie können die Crontab Ihres aktuellen Benutzers mit dem folgenden Befehl bearbeiten:

 crontab -e

Diese Crontab sollte Aufgaben enthalten, die für Ihr Benutzerkonto spezifisch sind. Stellen Sie sich vor, Sie arbeiten an einem Projekt, bei dem Sie eine MySQL-Datenbank befüllen. Sie können das mysqldump- Tool verwenden, um einen SQL-Dump einer gesamten Datenbank zu erstellen. Durch Umleiten der Ausgabe können Sie einfache, geplante Datenbanksicherungen durchführen.

 30 4 * * * /usr/local/mysql/bin/mysqldump --login-path=local --databases albums > /tmp/album-db.$(date +%s).sql

Standardmäßig sendet cron Ausgaben (einschließlich Fehlern) per E-Mail an den Benutzer, zu dem die crontab-Datei gehört. Sie können die Ausgabe jedoch genauso umleiten, wie Sie es von einer Befehlszeile aus tun würden, indem Sie die Notation > Dateiname verwenden.

Beachten Sie, wie das obige Beispiel die Befehlsersetzung verwendet, um den Dateinamen basierend auf dem aktuellen Unix-Zeitstempel zu erstellen. Da das % -Symbol eine besondere Bedeutung für cron hat, muss der Befehl es mit einem vorangestellten Backslash maskieren.

3. Überprüfen der Site-Uptime mit einem benutzerdefinierten Skript

Sie haben vielleicht bemerkt, dass der Befehl im letzten Beispiel unangenehm lang war. Glücklicherweise hindert Sie nichts daran, Befehle in einem Skript zu speichern und dieses Skript über Ihre crontab auszuführen. Hier ist ein Beispiel, das jede Minute ein Skript ausführt:

 * * * * * /Users/bobby/bin/site-monitor.sh

Beachten Sie, dass Sie theoretisch die HOME- Variable oder die Tilde-Erweiterung für einen kürzeren Befehl verwenden können:

 * * * * * ~/bin/site-monitor.sh

Sie können dies vermeiden, falls Cron dies jemals nicht mehr unterstützt. Es schadet nicht wirklich, den vollständigen Pfad zu verwenden, und er ist wohl besser lesbar.

Das Skript selbst verwendet das curl-Programm, um den HTTP-Statuscode für eine bestimmte URL abzurufen. Wenn der Status etwas anderes als Erfolg anzeigt, schreibt das Skript eine Nachricht in die Ausgabe.

Wie bereits erwähnt, sendet cron diese Ausgabe per E-Mail an uns. Es kann nützlich sein, dass Befehle in cron bei Erfolg keine Ausgabe erzeugen.

 #!/bin/bash
STATUS=`curl -s -o /dev/null -I -w "%{http_code}" http://example.com/`
if [ "$STATUS" != "200" ]
then
echo "site appears to be down"
fi

4. Speicherplatzberichte per E-Mail

Wenn Sie das standardmäßige E-Mail-Verhalten von Cron ändern möchten, können Sie die Umgebungsvariable MAILTO verwenden . Cron unterstützt einige Variablen, die Sie in Ihrer crontab-Datei festlegen können. Cron wendet diese Variablen dann auf die Umgebung jedes folgenden Befehls an.

Verwenden Sie das folgende Format, um eine alternative Ziel-E-Mail-Adresse festzulegen:

 MAILTO=user@example.com

Sie müssen dies auf einem Computer ausführen, der so eingerichtet ist, dass er bei Bedarf eine externe E-Mail sendet. Hier ist ein Beispiel, das eine E-Mail an einen anderen Benutzer auf demselben Computer sendet. Es fährt zweimal täglich, um 12:00 und 23:00 Uhr. Der Befehl df zeigt freien Speicherplatz an, daher delegiert dieser crontab-Eintrag die Aufgabe, zu überprüfen, ob der Speicherplatz in Ordnung ist:

 MAILTO="sarah"
0 12,23 * * * /bin/df -h

Die resultierende E-Mail sieht in etwa so aus:

Beachten Sie, dass Cron seine eigenen benutzerdefinierten E-Mail-Header hinzufügt. Diese können beim Debuggen nützlich sein. Sie können das standardmäßige E-Mail-Verhalten von Cron auch mit einer leeren Zeichenfolge deaktivieren:

 MAILTO=""

5. Senden Sie eine Nachricht zu bestimmten Zeiten

Die anderen Beispiele verwenden eine ziemlich einfache Zeitplanung, aber cron unterstützt eine leistungsstarke Syntax für Zeitangaben. Es verarbeitet nicht nur genaue Übereinstimmungen, sondern auch:

  • Mehrere durch Komma getrennte Werte ( , )
  • Mit Bindestrich ( ) angegebene Bereiche
  • Schrittwerte nach einem Schrägstrich ( / )

Wenn Sie also beispielsweise während der Arbeitszeit zweimal pro Stunde, aber nur alle drei Stunden eine Nachricht an alle eingeloggten Benutzer senden möchten, genügt etwa Folgendes:

 0 15,45 9-17/3 ? * * * echo 'Enjoy your work!' | wall

Dieser Befehl wird um 15 und 45 Minuten nach der vollen Stunde ausgeführt, alle drei Stunden während der Stunden von 9 bis 17 Uhr. Der wall-Befehl sendet eine Nachricht an jeden angemeldeten Terminalbenutzer.

Sie werden vielleicht sogar feststellen, dass Cron eine flexiblere Planung bietet als Ihre Kalender-App. Bei einigen Varianten können Sie Befehle angeben, die am zweiten Freitag eines Monats oder am nächsten Wochentag zu einem bestimmten Datum ausgeführt werden.

Cron kann viele Arten von Linux-Aufgaben automatisieren

Dies ist eine kleine Auswahl an Aufgaben, die cron Ihnen bei der Automatisierung helfen kann. Es kann einige Zeit dauern, sich mit der komplexen Syntax vertraut zu machen, aber cron ist ein mächtiges Dienstprogramm. Sie können cron sowohl für systemweite als auch für benutzerspezifische Aufgaben verwenden.

Mit einer komplizierten Syntax für die Planung ist cron mächtig, aber Sie sollten wahrscheinlich eine gute Referenz zur Hand haben. Crontabs erlauben Kommentare, daher möchten Sie vielleicht eine Kommentarzeile in Ihre einfügen, um die Zeitfelder zu dokumentieren.