Einführung
Wenn Sie jemals einen Cron Job
auf einem Ubuntu VPS eingerichtet haben, haben Sie möglicherweise Probleme erlebt, die Sie ratlos gemacht haben. Ein häufiges Problem tritt auf, wenn der Cron Job versucht, ein Skript auszuführen, ohne Erfolg, was zu Null-Byte-Ausgabedateien oder unvollständigen Operationen führt. In diesem Blogbeitrag untersuchen wir ein reales Szenario, in dem ein Ruby-Skript versucht, eine MySQL-Datenbank über einen Cron Job zu sichern, und Benutzer sich fragen, warum ihr Befehl in der Befehlszeile perfekt funktioniert, aber nicht bei der Planung.
Das Problem verstehen
Im hier diskutierten Fall wurde der Cron Job eingerichtet, um ein Ruby-Skript auszuführen, das die folgenden Aufgaben ausführt:
- MySQL-Datenbanksicherung: Verwendet
mysqldump
, um die indatabase.yml
angegebene Datenbank zu sichern. - Dateikomprimierung: Die Sicherungsdatei wird gzipped, um Speicherplatz zu sparen.
- Dateitransfer: Die gezippte Datei wird über SFTP an einen Remote-Server gesendet.
Obwohl das Skript gut funktioniert, wenn es direkt über die Befehlszeile ausgeführt wird, führte der Cron Job zur Generierung einer leeren Datei. Nachfolgend finden Sie eine vereinfachte Version des Cron Job-Befehls, die das Problem verursachte.
PATH=/usr/bin
10 3 * * * ruby /home/deploy/bin/datadump.rb
Warum passiert das?
Der Kern des Problems liegt in der Umgebung, in der der Cron Job ausgeführt wird. Wenn ein Skript oder Befehl über Cron ausgeführt wird, geschieht dies in einer eingeschränkten Umgebung, die nicht immer die Benutzersitzung im Terminal nachahmt. Dies kann zu unerwarteten Verhaltensweisen führen, insbesondere wenn:
- Arbeitsverzeichnis: Cron Jobs werden möglicherweise nicht im erwarteten Arbeitsverzeichnis ausgeführt.
- Umgebungsvariablen: Bestimmte Umgebungsvariablen sind möglicherweise nicht verfügbar, wenn ein Skript über Cron ausgeführt wird.
Lösung
Schritt 1: Überprüfen Sie das Arbeitsverzeichnis
Wenn Ihr Cron Job ausgeführt wird, wird er nicht im Kontext Ihrer typischen Benutzerumgebung gestartet. Oftmals hat er möglicherweise nicht dasselbe Home-Verzeichnis oder Arbeitsverzeichnis. Eine Möglichkeit, sicherzustellen, dass Ihr Skript sich gleich verhält, besteht darin, das Arbeitsverzeichnis ausdrücklich zu definieren.
So geben Sie das Arbeitsverzeichnis an:
- Sie können den
cd
-Befehl zu Beginn Ihres Cron Jobs verwenden:
10 3 * * * cd /home/deploy/bin && ruby datadump.rb
Schritt 2: Verwenden Sie absolute Pfade
Ein weiteres Problem könnte auftreten, wenn Ihr Skript Dateien mit relativen Pfaden erstellt. Die Ausführungsumgebung des Cron Jobs hat möglicherweise nicht die erforderlichen Berechtigungen zum Erstellen von Dateien in den Standardverzeichnissen. Um dies zu lösen:
- Verwenden Sie absolute Pfade für Dateioperationen innerhalb Ihres Skripts anstelle von relativen Pfaden.
Beispielsweise überarbeiten Sie die Dateigenerierung:
dump = "/home/deploy/backups/myapp-#{Time.now.strftime(TIMESTAMP)}.sql.gz"
Schritt 3: Korrigieren Sie die Berechtigungen
Überprüfen Sie, ob der Benutzer, der den Cron Job ausführt (in diesem Fall deploy
), die erforderlichen Berechtigungen für hat:
- Das Ausgabeverzeichnis, in dem die Backup-Dateien erstellt werden.
- Zugriff auf alle anderen Dateien oder Verzeichnisse, mit denen das Skript interagiert.
Schritt 4: Protokollausgabe zur Fehlersuche
Wenn Sie Protokollierung in Ihren Skripten verwenden, können Sie wertvolle Einblicke gewinnen, was passiert, wenn Cron den Job ausführt. Stellen Sie sicher, dass Sie protokollieren:
- Nachrichten, die den Beginn und den Abschluss von Aufgaben anzeigen.
- Alle Fehler, die während der Ausführung aufgetreten sind.
Sie können auch die Standardausgabe und Fehler in einer Protokolldatei innerhalb Ihres Cron Job-Befehls umleiten:
10 3 * * * ruby /home/deploy/bin/datadump.rb >> /home/deploy/log/cron.log 2>&1
Schritt 5: Umgebungsvariablen
Stellen Sie schließlich sicher, dass alle erforderlichen Umgebungsvariablen korrekt gesetzt sind. Der Cron Job erbt nicht alle Variablen aus Ihrer Shell, was zu Fehlern in der Skriptausführung führen kann.
Fazit
Indem Sie das Arbeitsverzeichnis überprüfen, absolute Pfade verwenden, die richtigen Berechtigungen sicherstellen, Ausgaben für eine einfachere Fehlersuche protokollieren und die Umgebungsvariablen überprüfen, können Sie Probleme mit nicht funktionierenden Cron Jobs effektiv beheben.
Technische Probleme mit Cron Jobs können frustrierend sein, aber mit systematischer Fehlersuche können Sie die Zuverlässigkeit der geplanten Aufgaben auf Ihrem System wiederherstellen.