Wie führt man einen Cron Job einmalig zu einer bestimmten Zeit aus?

Veröffentlicht 17. Oktober 2024

Problem: Einen Cron-Job einmalig zu einem bestimmten Zeitpunkt ausführen

Cron-Jobs werden normalerweise so eingerichtet, dass sie wiederholt zu geplanten Zeiten ausgeführt werden. Manchmal muss jedoch eine Aufgabe nur einmal zu einem bestimmten Zeitpunkt ausgeführt werden. Dies kann knifflig sein, wenn man Cron so einrichtet, dass es eine einzelne, zeitspezifische Aufgabe ohne Wiederholung ausführt.

Lösungen für die einmalige Ausführung von Cron-Jobs zu einem bestimmten Zeitpunkt

Verwendung des 'at'-Befehls für einmalige Terminplanung

Der 'at'-Befehl plant einmalige Aufgaben. Sie können einen zukünftigen Zeitpunkt für die Ausführung eines Befehls festlegen. Die Syntax lautet:

echo "/pfad/zum/befehl optionen" | at [zeit]

Um einen Befehl morgen auszuführen:

echo "/usr/bin/mein_befehl" | at now + 1 day

Tipp: Geplante Aufgaben überprüfen

Verwenden Sie den 'atq'-Befehl, um alle geplanten Aufgaben aufzulisten. Dies hilft Ihnen zu bestätigen, dass Ihre Aufgabe erfolgreich geplant wurde, und zeigt ihre Warteschlangennummer für mögliche Änderungen oder Löschungen an.

Cron-Job mit selbstdeaktivierendem Skript

Wenn 'at' nicht verfügbar ist, erstellen Sie ein selbstdeaktivierendes Skript:

  1. Richten Sie einen Cron-Job mit einer bestimmten Zeit ein:

    0 0 2 12 * /pfad/zu/ihrem_skript.sh
  2. Erstellen Sie ein Skript, das nur einmal ausgeführt wird:

    #!/bin/bash
    
    SKRIPT="/pfad/zu/ihrem_skript.sh"
    MARKER="${SKRIPT}.erledigt"
    
    if [ -f "$MARKER" ]; then
     exit 0
    fi
    
    # Ihre einmalige Aufgabe hier
    echo "Aufgabe ausgeführt" | mail -s "Einmalige Aufgabe abgeschlossen" benutzer@beispiel.de
    
    touch "$MARKER"

Dieses Skript prüft auf eine Markierungsdatei und beendet sich, wenn diese existiert, um mehrfache Ausführungen zu verhindern.

Verwendung von Cron mit Datumsprüfung

Eine weitere Methode verwendet die Datumsprüfung:

#!/bin/bash

AUSFÜHRUNGSDATUM="2023-12-25"
AKTUELLES_DATUM=$(date +%Y-%m-%d)

if [ "$AKTUELLES_DATUM" != "$AUSFÜHRUNGSDATUM" ]; then
  exit 0
fi

# Ihre einmalige Aufgabe hier
echo "Feiertagsaufgabe ausgeführt" | mail -s "Feiertagsaufgabe abgeschlossen" benutzer@beispiel.de

Dieses Skript führt die Aufgabe nur am festgelegten Datum aus und beendet sich, wenn das aktuelle Datum nicht übereinstimmt.

Beispiel: Protokollierung zu datumsbasierten Cron-Jobs hinzufügen

#!/bin/bash

AUSFÜHRUNGSDATUM="2023-12-25"
AKTUELLES_DATUM=$(date +%Y-%m-%d)
PROTOKOLLDATEI="/var/log/einmaliger_cron.log"

if [ "$AKTUELLES_DATUM" != "$AUSFÜHRUNGSDATUM" ]; then
  echo "$(date): Skript geprüft, aber nicht ausgeführt (falsches Datum)" >> "$PROTOKOLLDATEI"
  exit 0
fi

# Ihre einmalige Aufgabe hier
echo "Feiertagsaufgabe ausgeführt" | mail -s "Feiertagsaufgabe abgeschlossen" benutzer@beispiel.de

echo "$(date): Aufgabe erfolgreich ausgeführt" >> "$PROTOKOLLDATEI"

Dieses Beispiel fügt eine Protokollierung hinzu, um Ausführungsversuche und Erfolge des Skripts zu verfolgen, was nützlich für die Überwachung und Fehlerbehebung von einmaligen Cron-Jobs ist.