Höchstwahrscheinlich wird cron in einer sehr spärlichen Umgebung ausgeführt. Überprüfen Sie die Umgebungsvariablen, die Cron verwendet, indem Sie einen Dummy-Job anhängen, der env
ausgibt in eine Datei wie diese:
* * * * * env > env_dump.txt
Vergleichen Sie das mit der Ausgabe von env
in einer normalen Shell-Sitzung.
Sie können der lokalen Crontab Ihre eigenen Umgebungsvariablen voranstellen, indem Sie sie oben in Ihrer Crontab definieren.
Hier ist eine schnelle Lösung, um $PATH
voranzustellen zur aktuellen Crontab:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
Die resultierende Crontab sieht ähnlich aus wie die Antwort von Chrissygormley, wobei PATH vor den Crontab-Regeln definiert ist.
Sie sollten vollständige Pfade in Ihre crontab
einfügen . Das ist die sicherste Option.
Wenn Sie das nicht möchten, können Sie ein Wrapper-Skript um Ihre Programme legen und dort den PATH setzen.
z. B.
01 01 * * * command
wird zu:
01 01 * * * /full/path/to/command
Auch alles, was von cron
aufgerufen wird sollte sehr vorsichtig mit den Programmen sein, die es ausführt, und wahrscheinlich seine eigene Wahl für PATH
setzen Variable.
BEARBEITEN:
Wenn Sie nicht wissen, wo sich der gewünschte Befehl befindet, führen Sie which <command>
aus von Ihrer Shell und es wird Ihnen den Pfad sagen.
BEARBEITEN2:
Sobald Ihr Programm also läuft, sollte es als Erstes PATH
setzen und jede andere erforderliche Variable (z. B. LD_LIBRARY_PATH
) auf die Werte, die für die Ausführung des Skripts erforderlich sind.
Anstatt darüber nachzudenken, wie Sie die Cron-Umgebung ändern können, um sie für Ihr Programm/Skript besser geeignet zu machen, sorgen Sie dafür, dass Ihr Skript die angegebene Umgebung handhabt, indem Sie beim Start eine geeignete Umgebung festlegen.
Ich habe /etc/crontab
verwendet . Ich habe vi
verwendet und die von mir benötigten PATHs in diese Datei eingegeben und als root ausgeführt. Die normale Crontab überschreibt PATHs, die Sie eingerichtet haben. Eine gute Anleitung dazu.
Die systemweite Cron-Datei sieht folgendermaßen aus:
This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
42 6 * * * root run-parts --report /etc/cron.daily
47 6 * * 7 root run-parts --report /etc/cron.weekly
52 6 1 * * root run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py