Systemd-Timer einrichten

Eine Anleitung, um systemd-Timer als moderne Alternative zu Cronjobs einzurichten – flexibel und effizient.

Systemd-Timer sind eine leistungsstarke Alternative zu Cronjobs, um Aufgaben zeitgesteuert auszuführen. Sie bieten mehr Flexibilität und bessere Integration in das Systemd-Ökosystem. In diesem Artikel zeige ich dir, wie du systemd-Timer einrichtest und verwendest.

Was ist ein systemd-Timer?

Ein systemd-Timer ist eine systemd-Einheit (Unit), die zeitgesteuert einen anderen Dienst (Service) ausführt. Timer ersetzen Cronjobs und bieten Vorteile wie:

  • Bessere Protokollierung über journalctl.
  • Abhängigkeiten und Startbedingungen können definiert werden.
  • Präzisere Steuerung der Ausführungszeit.

Grundlegender Aufbau

Ein systemd-Timer besteht aus zwei Dateien:

  1. Service-Datei: Definiert, was ausgeführt werden soll.
  2. Timer-Datei: Definiert, wann der Service ausgeführt wird.

Beide Dateien werden im Verzeichnis /etc/systemd/system/ gespeichert.

Schritt 1: Erstelle die Service-Datei

Die Service-Datei beschreibt die Aktion, die ausgeführt werden soll. Beispiel: Wir möchten ein Skript /usr/local/bin/backup.sh ausführen.

Erstelle eine Datei namens backup.service:

1
nano /etc/systemd/system/backup.service

Inhalt der Datei:

1
2
3
4
5
6
7
[Unit]
Description=Backup Script
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Erklärung:

  • [Unit]: Beschreibt die Einheit. Description gibt eine kurze Beschreibung, und After=network.target stellt sicher, dass das Netzwerk verfügbar ist, bevor der Service startet.
  • [Service]: Definiert den Service. Type=oneshot bedeutet, dass der Service eine einmalige Aktion ausführt. ExecStart gibt den Befehl oder das Skript an, das ausgeführt werden soll.

Schritt 2: Erstelle die Timer-Datei

Die Timer-Datei definiert, wann der Service ausgeführt wird. Erstelle eine Datei namens backup.timer:

1
nano /etc/systemd/system/backup.timer

Inhalt der Datei:

1
2
3
4
5
6
7
8
9
[Unit]
Description=Run Backup Script Daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Erklärung:

  • [Unit]: Wie bei der Service-Datei, eine kurze Beschreibung.
  • [Timer]: Hier wird die Zeitsteuerung definiert.
    • OnCalendar=daily: Führt den Service täglich um Mitternacht aus. Du kannst auch andere Zeitangaben verwenden (siehe unten).
    • Persistent=true: Stellt sicher, dass der Timer nach einem Neustart ausgeführt wird, falls er während des Ausfalls verpasst wurde.
  • [Install]: WantedBy=timers.target sorgt dafür, dass der Timer beim Systemstart aktiviert wird.

Zeitangaben für systemd-Timer

Die Zeitangabe für einen systemd-Timer wird in der Timer-Datei mit der Option OnCalendar definiert. Systemd unterstützt dabei ein flexibles und mächtiges Zeitformat, das sowohl einfache als auch komplexe Zeitpläne ermöglicht. Hier sind einige Beispiele und Erklärungen:

Grundlegendes Format

Das allgemeine Format für OnCalendar lautet:

1
OnCalendar=YYYY-MM-DD HH:MM:SS
  • YYYY: Jahr (z. B. 2025)
  • MM: Monat (01 bis 12)
  • DD: Tag (01 bis 31)
  • HH: Stunde (00 bis 23)
  • MM: Minute (00 bis 59)
  • SS: Sekunde (00 bis 59)

Du kannst Platzhalter (*) verwenden, um bestimmte Teile flexibel zu halten.

Häufige Zeitangaben

  1. Stündlich (jede volle Stunde):

    1
    
    OnCalendar=hourly
    

    Entspricht: *-*-* *:00:00

  2. Täglich um Mitternacht:

    1
    
    OnCalendar=daily
    

    Entspricht: *-*-* 00:00:00

  3. Wöchentlich (Sonntag um Mitternacht):

    1
    
    OnCalendar=weekly
    

    Entspricht: Sun *-*-* 00:00:00

  4. Monatlich (1. Tag des Monats um Mitternacht):

    1
    
    OnCalendar=monthly
    

    Entspricht: *-*-01 00:00:00

  5. Jährlich (1. Januar um Mitternacht):

    1
    
    OnCalendar=yearly
    

    Entspricht: *-01-01 00:00:00

Benutzerdefinierte Zeitangaben

  1. Jeden Tag um 15:30 Uhr:

    1
    
    OnCalendar=*-*-* 15:30:00
    
  2. Jeden Montag um 08:00 Uhr:

    1
    
    OnCalendar=Mon *-*-* 08:00:00
    
  3. Jeden ersten Tag eines Monats um 12:00 Uhr:

    1
    
    OnCalendar=*-*-01 12:00:00
    
  4. Jeden letzten Tag eines Monats um 23:59 Uhr:

    1
    
    OnCalendar=*-*-28..31 23:59:00
    

    (Systemd erkennt automatisch den letzten Tag eines Monats, z. B. 28, 30 oder 31.)

  5. Jeden zweiten Tag um 06:00 Uhr:

    1
    
    OnCalendar=*-*-1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 06:00:00
    

Wiederholungen und Intervalle

  1. Alle 5 Minuten:

    1
    
    OnCalendar=*:0/5
    

    (Wird bei Minute 0, 5, 10, 15 usw. jeder Stunde ausgeführt.)

  2. Alle 2 Stunden:

    1
    
    OnCalendar=*-*-* 0/2:00:00
    

    (Wird um 00:00, 02:00, 04:00 usw. ausgeführt.)

  3. Alle 15 Minuten:

    1
    
    OnCalendar=*:0/15
    

    (Die Minuten werden in 15-Minuten-Schritten ausgeführt: 00, 15, 30, 45.)

  4. Alle 10 Tage:

    1
    
    OnCalendar=*-*-01,11,21 00:00:00
    

Schritt 3: Systemd neu laden

Nachdem die Dateien erstellt wurden, lade die systemd-Konfiguration neu:

1
systemctl daemon-reload

Schritt 4: Timer aktivieren und starten

Aktiviere den Timer, damit er beim Systemstart automatisch gestartet wird:

1
systemctl enable --now backup.timer

Das --now startet dem Timer direkt mit dem aktivieren. Falls ihr ihn manuell starten wollt lasst es weg und nutzt:

1
systemctl start backup.timer

Schritt 5: Überprüfe den Timer

Um sicherzustellen, dass der Timer korrekt eingerichtet ist, kannst du ihn dir anzeigen lassen:

1
systemctl status backup.timer

Optionale Befehle und Tipps

  1. Alle Timer überprüfen:

    1
    
    systemctl list-timers --all
    

    Die Ausgabe zeigt alle aktiven und inaktiven Timer, einschließlich der nächsten und letzten Ausführungszeit.

  2. Service-Status überprüfen:

    1
    
    systemctl status backup.service
    
  3. Logs des Services anzeigen:

    1
    
    journalctl -u backup.service
    
  4. Timer stoppen oder deaktivieren:

    • Timer stoppen:
      1
      
      systemctl stop backup.timer
      
    • Timer deaktivieren:
      1
      
      systemctl disable backup.timer
      

Fazit

Systemd-Timer sind eine moderne und leistungsstarke Alternative zu Cronjobs. Sie bieten präzise Steuerungsmöglichkeiten, bessere Protokollierung und nahtlose Integration in das System. Mit den oben beschriebenen Schritten kannst du ganz einfach eigene Timer einrichten und verwalten.