Cron - Linux automatisieren

Cron & Systemd

Viele Dinge und Aufgaben lassen sich unter Linux problemlos automatisieren, dazu gibt es mehrere Möglichkeiten und diese werden hier aufgezählt.

Informationen

Wenn man am Computer sitzt macht man oft viele Dinge die mit der eigentlichen Arbeit nichts zu tun haben, so etwa Backups, Reinigung des Systems und noch viel mehr Dinge die den Nutzer von der Arbeit abhalten. Linux ist hier sehr flexibel und so ziemlich alles lässt sich automatisieren, dazu gibt es auf diesem System mehrere verschiedene Möglichkeiten - Cron, At, Anacron und Systemd.

at

at ist eine winzige kleine Software mit der sich Aktionen nach einem von Ihnen gestellten Zeitpunkt einmalig ausführen lassen, das Terminal muss für diese Aktion natürlich geöffnet bleiben. Normalerweise ist diese Software automatisch installiert, ist dies nicht der Fall lässt sich dies über die Paket-Verwaltung durch das Paket "at" nach holen. Wichtig ist noch - die Software führt Scripte nur dann aus wenn at mit der Bash (also nicht etwa mit Zsh) genutzt wird.

Nehmen wir einmal an ich möchte die Software einmalig als Wecker nutzen und der Konsolen-Player Mpg123 (Paket "mpg123") soll zur fest gesetzten Zeit eine Audio-Datei starten. Um mit Mpg123 eine Datei abzuspielen gibt man einfach die zu nutzende Datei als Option an - also etwa:

mpg123 /Musik/Dateiname.mp3

Man muss jetzt nur noch Mpg123 dazu bringen zur angegebenen Zeit zu starten, und dazu nutzen wir in diesem Beispiel at. Als Zeitangabe nutze ich jetzt einmal einfach heute um 19:45, dies ergibt den Befehl:

at 19:45 mpg123 Musik/Dateiname.mp3

Der selbe Befehl für morgen um die selbe Zeit:

at 19:45 tomorrow mpg123 Musik/Dateiname.mp3

Weitere Möglichkeiten wären:

Option

Bedeutung

today

Heute

tomorrow

Morgen

noon teatime midnight

Mittag, 16:00 und Mitternacht

now

Jetzt

now + Zeit

Etwa 'now + 15min' - jetzt in 15 Minuten, auch 'hours' (Stunden), 'days' (Tage), 'weeks' (Wochen) oder 'months' (Monaten) ist möglich

19:55

Konkrete Zeitangabe

5.10.19

Am 10. Mai 2019

Hat man der Software mehrere Aufgaben gestellt ist es möglich diese mit dem Befehl:

atq

abrufen, hierbei werden jedoch nur die Job-ID's angezeigt, um zu sehen welche Aufgabe hinter einer Job-ID steht nutzt man als Administrator den Befehl:

at -c Job-ID

Will man einen Job löschen kann man dies mit dem Befehl:

atrm Job-ID

tun.

Cron

Anders als at ist Cron für wiederkehrende Aufgaben zuständig die zu einem bestimmten Zeitpunkt ausgeführt werden sollen. In diesem Beispiel will ich automatisch ein Script starten, beispielsweise ein Backup-Script. Die Datei nennt sich ganz einfach "script.sh", gestartet würde diese also einfach mit dem Befehl:

sh Scripte/script.sh

Nun möchte ich das dieses Script jeden Dienstag in jeder Woche des Monats um 2 Uhr früh ausgeführt wird. In diesem Fall nur für mich als normaler Nutzer.

Nun gilt es als erstes eine so genannte Crontab anzulegen, im Grunde genommen eine einfache Textdatei in der Zeile für Zeile alle Aufgaben stehen. Man legt diese auf dem Terminal mit dem Befehl:

crontab -e

an:

Cron - Linux automatisieren - Crontab

Cron - Linux automatisieren - Crontab

Beim ersten Start fragt die Software nach dem zu nutzenden Editor, vier sind angegeben - vor jedem steht eine Zahl, drücken Sie die Zahl und der Editor wird gestartet, für Linux-Einsteiger schlage ich den Editor Nano vor.

Nun legt man für jede auszuführende Aktion eine neue Zeile an, in meinem Beispiel würde dies so aussehen:

0 2 * * 2 sh /home/robert/Scripte/script.sh

Die Angabe der Zeit die zu Beginn der Zeile steht ist zu Beginn etwas unverständlich - men versteht jedoch schnell worum es geht, die Zeichen stehen der Reihe nach für:

Minute Stunde Tag Monat Wochentag

In diesem Fall bedeutet dies "0 in der ersten Minute um 2 Uhr * jeden Tag * in jedem Monat am 2. Wochentag (Dienstag). Steht statt einer Angabe ein Sternchen "*" gilt die Zeit für alles. Folgende Angaben sind möglich:

Cron-Zeit

Auch der Administrator selbst kann natürlich seine eigene Crontab anlegen, man startet dann ganz einfach den Befehl:

crontab -e

als Administrator. Weiters gibt es noch die Möglichkeit systemweite Cron-Jobs anzulegen, dazu finden sich im System unter "/etc" die Datei "crontab", sie wird jedoch mit einem normalen Editor als Administrator bearbeitet - im Grunde genommen ist der Aufbau der selbe wie die normale Nutzer-Crontab - der einzige Unterschied ist das zwischen Zeit-Angabe und Befehl der Nutzer angeführt wird mit dessen Rechten der Befehl ausgeführt wird, also etwa:

0 2 * * 2 robert sh /home/robert/Scripte/script.sh

Grafische Anwendungen für Cron wären etwa für KDE der Aufgaben-Planer in den Systemeinstellungen:

Kcron - Cron grafisch unter KDE einrichten

Kcron - Cron grafisch unter KDE einrichten

Diese Software wird über die Paket-Verwaltung durch das Paket "kde-config-cron" installiert.

Anacron

Ein kleines Problem hat Cron, wenn der Rechner zu der Zeit in der ein Befehl ausgeführt werden soll nicht eingeschaltet ist wird der Befehl einfach nicht ausgeführt, er wird auch nicht nach geholt sondern einfach zum nächsten angegebenen Zeitpunkt ausgeführt. Dies wäre natürlich im Fall eines Backups fatal wenn die Kiste genau dann den Geist aufgibt und man hat kein aktuelles Backup. In diesem Fall hilft Anacron, dieser Software ist die Uhrzeit komplett egal, sie führt einen Befehl zum ehesten Zeitpunkt nach dem Einschalten des Rechners stündlich, täglich, wöchentlich oder monatlich aus.

Die Software ist meist nicht automatisch installiert, dies holen Sie einfach über die Paket-Verwaltung durch das Paket "anacron" nach.

Um einen Befehl nach den oben angegebenen Intervallen auszuführen schreiben Sie einfach ein passendes Script, machen es ausführbar und speichern es als Administrator im passenden Verzeichnis "/etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/", das Script wird dann automatisch im angegebenen Intervall ausgeführt. Wichtig - der Name des Scripts darf im Dateinamen nur Groß- und Klein-Buchstaben, Zahlen, Bindestriche und Unterstriche enthalten, keine Sonderzeichen, Punkte oder Leerzeichen - ist dies nicht der Fall wird das Script nicht ausgeführt.

Eine weitere zusätzliche Möglichkeit zur Konfiguration ist die Datei "/etc/anacrontab" die durch die Installation der Software automatisch erstellt wird. In dieser Datei gibt man die Verzögerung nach dem Start des Systems an nach der Anacron seine Arbeit startet - dies dient dazu das nicht alles beim Starten des Systems ausgeführt wird und die eigene Arbeit behindert. Die Syntax dieser Datei sieht so aus:

* * * Befehl oder Script

Als kleines Beispiel:

1 10 /etc/dateiname.txt sh /home/robert/Scripte/script.sh

Das erste Sternchen gibt an ob der Befehl täglich "1", wöchentlich "7" oder monatlich "30" ausgeführt werden soll, das zweite Sternchen gibt die Minuten an die Anacron nach dem Start des Systems warten soll bis es mit der Arbeit beginnt und das letzte gibt eine Datei an in der die Software einen Zeitstempel ablegt (dies kann man auch sein lassen und ist nur dann nützlich wenn die Software stündliche Arbeiten zu erledigen hat).

Systemd

Auch Systemd bietet die Möglichkeit Aufgaben automatisch zu erledigen. Im Beispiel nehme ich wieder meine Datei "script.sh" die etwa die Befehle für ein Backup enthält, das erste was es dabei zu erstellen gilt ist eine neue Unit - also Systemd-Aufgabe. Es handelt sich dabei wieder um eine einfache Textdatei mit einem Namen den kein anderes Systemd-Service hat, die Endung muss sich ".service" nennen. In meinem Beispiel nenne ich die Datei einfach "backup.service", der Inhalt:

[Unit]
Description=Backup des Systems

[Service]
ExecStart=/home/robert/Scripte/script.sh

Man speichert die Datei natürlich als Administrator unter "/etc/systemd/system/", damit wäre die Arbeit erledigt - der Befehl wird beim Start des Systems ausgeführt.

Ein Problem - beim Start des Systems starten aber natürlich viele Dienste - hier etwa auch gleich ein Backup anzufertigen wäre natürlich sind sonderlich produktiv und der Start dauert länger. In diesem Fall erstellen wir eine weitere Textdatei mit der Datei-Endung ".timer" und mit dem selben Datei-Namen wie unsere gerade erstellte Unit - in meinem Beispiel also "backup.timer". Der Aufbau der Datei ist dem der Unit sehr ähnlich, in meinem Beispiel:

[Unit]
Description=Backup des Systems

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizeDelay=1h

[Install]
WantedBy=timers.target

Die ersten drei Sternchen geben das Datum an (Jahr Monat Tag) und dann folgt die Uhrzeit, ein Sternchen zeigt also nicht benötigte Angaben - in diesem Fall wird das Script jedes Jahr, jedes Monat und jeden Tag um 2 Uhr früh ausgeführt. Der Eintrag "Persistent=true" sorgt dafür falls der Rechner zum angegebenen Zeitpunkt nicht läuft das der Befehl so schnell wie möglich nach geholt wird - in diesem Fall eine Stunde nach dem Start des Systems - "RandomizeDelay=1h".

Man kann auch dafür sorgen das Systemd den Befehl wöchentlich oder täglich ausführt ohne Zeitangabe, etwa täglich:

OnCalendar=daily

Um einen Befehl automatisch 10 Minuten nach jedem System-Start auszuführen ersetzt man "OnCalendar=" einfach durch:

OnBootSec=10m

Der Eintrag "WantedBy=timers.target" sorgt schließlich dafür das die Unit automatisch mit dem System gestartet wird - natürlich nach den von Ihnen vor genommenen Einstellungen. Schlussendlich gilt es nur noch die Timer-Datei wieder unter "/etc/systemd/system/" zu speichern und zu aktivieren: