Ich habe ein Bash-Skript, das die Jobs in einem Cluster überwacht und die Ausgabe des LSF-Warteschlangensystems-Befehls "bqueues" analysiert. Das Skript läuft gut. Jetzt wollte ich einen Crontab-Eintrag erstellen, der dieses Skript aufruft. Das Problem ist, dass alles, was mit bqueues zu tun hat, überhaupt keine Ausgabe erzeugt. Was könnte der Grund sein?
Antwort
Zu viele Anzeigen?- Cron-Jobs erben nicht die Anmeldeumgebung des Benutzers. Speziell Umgebungsvariablen, die in .login oder .profile festgelegt sind, stehen einfach nicht zur Verfügung. Der mit Abstand häufigste Grund, warum Cron-Jobs fehlschlagen, ist, dass die PATH-Einstellung nicht dem entspricht, was der Skriptautor angenommen hat.
- Cron-Jobs haben kein stdin mit ihnen verbunden. Während cron die .login/.profile eines Benutzers nicht ausführt, wird die Shell normal gestartet - wodurch die Startdatei der Shell (.cshrc, .bashrc usw.) ausgeführt wird. Außerdem können einige Befehle, die im Cronjob verwendet werden, auf das Vorhandensein eines Terminals angewiesen sein. Wenn Sie beispielsweise versuchen, 'vi' im Stapelmodus zu starten, tun Sie dies nicht. Ersetzen Sie es stattdessen durch ed oder sed.
- Die Ausgabe des Cron-Jobs wird per Unix-Mail an den Crontab-Besitzer gesendet.
- Berechtigungen für den Crontab selbst. Viele Cron-Implementierungen schauen nicht einmal auf einen Crontab, wenn die Berechtigungen auf der Datei falsch eingestellt sind. Generell sollten die Berechtigungen extrem restriktiv sein - nur Lesen/Schreiben für den Besitzer und KEINE Berechtigungen für Gruppe oder andere.
- Vergleichen Sie Umgebungen, indem Sie
env
aus der Shell und dem Crontab aufrufen. - ...
Weitere Debugging-Tipps finden Sie unter Wie kann man ein Problem debuggen, bei dem Cron ein bestimmtes Skript nicht ausführt -- oder andere?