Ich versuche, Cron dazu zu bringen, die richtigen Pfade einzugeben. Wenn ich ein Python-Skript über die Shell ausführe, läuft das Skript einwandfrei, da es die in bashrc festgelegten PATHs verwendet. Wenn ich jedoch cron verwende, werden nicht alle PATHs über bashrc verwendet. Gibt es eine Datei, in die ich die PATHs für cron wie bashrc eingeben kann, oder eine Möglichkeit, die PATHs von bashrc aus aufzurufen?
Es tut mir leid, ich glaube nicht, dass ich das richtig formuliert habe. Ich kann das richtige Skript ausführen (was bedeutet, dass der Pfad zum Skript in crontab hier nicht das Problem ist). Nur wenn dieses Skript ausgeführt wird, führe ich einen Build aus und dies verwendet das Pfade setzen ein .bashrc
. Wenn ich das Skript beim .bashrc
Anmelden ausführe , werden die Pfade eingezogen. Da cron nicht in einer Shell ausgeführt wird, wird es nicht eingezogen .bashrc
. Gibt es eine Möglichkeit, dies zu erreichen, ohne einen Bash-Script-Wrapper schreiben zu müssen?
source /etc/profile
: Es sollte essen.bashrc
und viele andere potenziell fehlende Dinge für Sie. Explizites Profil-Sourcing wird sehr nützlich, wenn einige Skripte "eigenständig" ausgeführt werden sollen. Es schützt auch vor seltsamen Umgebungen und so ...sh
funktionieren von crontab aufgerufene Skripte. Sie können bestätigen, dass der Pfad aktualisiert wird, indem Sie einen Job wie hinzufügen* * * * * echo $PATH > ~/crontab_path.txt
und die Datei nach einer Minute überprüfen.Antworten:
Ich habe benutzt
/etc/crontab
. Ichvi
habe die benötigten Pfade verwendet und in diese Datei eingegeben und sie als root ausgeführt. Die normale Crontab überschreibt die von Ihnen eingerichteten Pfade. Ein gutes Tutorial dazu .Die systemweite Cron-Datei sieht folgendermaßen aus:
quelle
/etc/crontab
für cron verfügbar sind, wenn sie als Root in Ubuntu 14.04 ausgeführt werden. (sudo crontab -e
)Cron läuft höchstwahrscheinlich in einer sehr spärlichen Umgebung. Überprüfen Sie die Umgebungsvariablen, die cron verwendet, indem Sie einen Dummy-Job anhängen, der
env
an eine Datei wie diese ausgegeben wird :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 auf Ihrer Crontab definieren.
Hier ist eine schnelle Lösung,
$PATH
um der aktuellen Crontab voranzukommen:Die resultierende Crontab ähnelt der Antwort von Chrissygormley, wobei PATH vor den Crontab-Regeln definiert wurde.
quelle
Sie sollten vollständige Pfade in Ihre setzen
crontab
. Das ist die sicherste Option.Wenn Sie dies nicht möchten, können Sie ein Wrapper-Skript um Ihre Programme legen und dort den Pfad festlegen.
z.B
wird:
Auch alles, was von aufgerufen wird,
cron
sollte sehr vorsichtig mit den Programmen sein, die es ausführt, und wahrscheinlich seine eigene Wahl für diePATH
Variable festlegen .BEARBEITEN:
Wenn Sie nicht wissen, wo sich der Befehl befindet, den Sie
which <command>
von Ihrer Shell ausführen möchten, wird Ihnen der Pfad angezeigt.EDIT2:
Sobald Ihr Programm ausgeführt wird, sollte es zunächst
PATH
alle anderen erforderlichen Variablen (z. B.LD_LIBRARY_PATH
) auf die Werte setzen, die für die Ausführung des Skripts erforderlich sind.Anstatt zu überlegen, wie Sie die Cron-Umgebung ändern können, um sie für Ihr Programm / Skript besser geeignet zu machen, sollten Sie Ihr Skript mit der gegebenen Umgebung umgehen lassen, indem Sie beim Start eine geeignete festlegen.
quelle
crontab
.Das Einstellen von PATH direkt vor der Befehlszeile in meiner Crontab hat für mich funktioniert:
quelle
Das Hinzufügen einer PATH-Definition zum Benutzer crontab mit korrekten Werten hilft ... Ich habe meine mit nur gefüllt:
Und es reicht aus, um alle meine Skripte zum Laufen zu bringen ... Fügen Sie dort bei Bedarf einen benutzerdefinierten Pfad hinzu.
quelle
/etc/crontab
. Dies ist die einfachste Antwort auf Benutzerebene. Gute Arbeit @ Treviño. Stimmen Sie ab, wenn Sie damit einverstanden sind.Lassen Sie Ihre Variablen für Sie arbeiten, dies ermöglicht den Zugriff auf t
Definieren Sie Ihren PFAD in /etc/profile.d/*.sh
Systemweite Umgebungsvariablen
Dateien mit der Erweiterung .sh im Verzeichnis /etc/profile.d werden ausgeführt, wenn eine Bash-Anmeldeshell eingegeben wird (z. B. beim Anmelden von der Konsole oder über ssh) sowie vom DisplayManager, wenn die Desktop-Sitzung geladen wird.
Sie können beispielsweise die Datei /etc/profile.d/myenvvars.sh erstellen und folgende Variablen festlegen:
Führen Sie crontab mit Login-Option aus!
CRONTAB führt ein Skript oder einen Befehl mit Umgebungsvariablen aus
quelle
Problem
Ihr Skript funktioniert, wenn Sie es über die Konsole ausführen, schlägt jedoch in cron fehl.
Ursache
Ihre Crontab hat nicht die richtigen Pfadvariablen (und möglicherweise die Shell)
Lösung
Fügen Sie Ihre aktuelle Shell hinzu und verfolgen Sie die Crontab
Skript, um es für Sie zu tun
Quelle
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Beispielausgabe
quelle
Auf meinem AIX nimmt cron seine Umgebungsvariablen aus / etc / environment auf und ignoriert dabei, was im .profile festgelegt ist.
Bearbeiten: Ich habe auch ein paar Linux-Boxen unterschiedlichen Alters ausgecheckt und diese scheinen auch diese Datei zu haben, daher ist dies wahrscheinlich nicht AIX-spezifisch.
Ich habe dies mit dem Cron-Vorschlag von Joemaller überprüft und die Ausgabe vor und nach dem Bearbeiten der PATH-Variablen in / etc / environment überprüft.
quelle
Wenn Sie nicht an verschiedenen Stellen dieselben Änderungen vornehmen müssen, gehen Sie ungefähr so vor:
Das . Leerzeichen und dann der Pfad zu .bashrc und der Befehl && sind die Magie, um Ihre Umgebungsänderungen in die laufende Bash-Shell zu integrieren. Auch wenn Sie wirklich wollen, dass die Shell Bash ist, ist es eine gute Idee, eine Linie in Ihrer Crontab zu haben:
Hoffe es hilft jemandem!
quelle
Die Standardumgebung für Cron-Jobs ist sehr spärlich und unterscheidet sich möglicherweise stark von der Umgebung, in der Sie Ihre Python-Skripte entwickeln. Für ein Skript, das möglicherweise in Cron ausgeführt wird, sollte jede Umgebung, von der Sie abhängig sind, explizit festgelegt werden. Fügen Sie in die Cron-Datei selbst vollständige Pfade zu ausführbaren Python-Dateien und zu Ihren Python-Skripten ein.
quelle
Ich weiß, dass dies bereits beantwortet wurde, aber ich dachte, dass seine für einige nützlich sein würde. Ich hatte ein ähnliches Problem, das ich kürzlich gelöst habe ( hier zu finden ). Hier sind die Höhepunkte der Schritte, die ich zur Beantwortung dieser Frage unternommen habe:
Stellen Sie sicher, dass Sie die Variablen, die Sie in PYTHONPATH (hier und hier und für weitere Informationen hier) benötigen, in der .profile oder .bash_profile für jede Shell haben, in der Sie Ihr Skript testen möchten, um sicherzustellen, dass es funktioniert.
Bearbeiten Sie Ihre Crontab so, dass sie die Verzeichnisse enthält, die zum Ausführen Ihres Skripts in einem Cron-Job erforderlich sind (hier und hier zu finden).
a) Stellen Sie sicher, dass Sie das Stammverzeichnis in die PATH-Variable (.) aufnehmen, wie hier erläutert (wenn Sie eine ausführbare Datei mit Ihrem Befehl ausführen, muss sie in der Lage sein, root oder das Verzeichnis zu finden, in dem die ausführbare Datei gespeichert ist) und wahrscheinlich diese (/ sbin: / bin: / usr / sbin: / usr / bin)
Erstellen Sie in Ihrer crontab-Datei einen Cronjob, der das Verzeichnis in das Verzeichnis ändert, in dem Sie das Skript zuvor erfolgreich ausgeführt haben (z. B. Benutzer / Benutzer / Dokumente / foo).
a) Dies sieht folgendermaßen aus:
quelle
@ Trevino: Ihre Antwort hat mir geholfen, mein Problem zu lösen. Für Anfänger jedoch versuchen, einen schrittweisen Ansatz zu geben.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- Auf diese Weise können Sie verstehen, welchen PATH-Wert derzeit von crontab verwendet wird. Führen Sie crontab aus und holen Sie sich den von crontab verwendeten Wert $ PATH.crontab -e
; b)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(es ist ein Probenpfad); c) jetzt Ihren geplanten Job / Skript wie*/10 * * * * sh runMyJob.sh &
; d) Entfernen Sie esecho $PATH
von Crontab, da es jetzt nicht benötigt wird.quelle
Stellen Sie den gewünschten Pfad in Ihrem Cron ein
Bearbeiten: Drücken Sie
i
Speichern und schließen
:wq
quelle
Die einfachste Problemumgehung, die ich gefunden habe, sieht folgendermaßen aus:
Dieses Beispiel wird
su
als Root-Benutzer aufgerufen und startet die Shell mit der vollständigen Umgebung des Benutzers, einschließlich $ PATH, die so eingestellt ist, als ob sie angemeldet wären. Es funktioniert in verschiedenen Distributionen gleich und ist zuverlässiger als die Beschaffung von .bashrc (was nicht funktioniert hat) me) und vermeidet das Hardcodieren bestimmter Pfade, was ein Problem sein kann, wenn Sie ein Beispiel oder ein Setup-Tool bereitstellen und nicht wissen, welche Distribution oder welches Dateilayout auf dem System des Benutzers vorhanden ist.Sie können den Benutzernamen auch nach angeben,
su
wenn Sie einen anderen Benutzer als root möchten. Sie sollten denroot
Parameter jedoch wahrscheinlich vor demsu
Befehl belassen, da dies sicherstellt, dass Siesu
über ausreichende Berechtigungen verfügen, um zu einem von Ihnen angegebenen Benutzer zu wechseln.quelle
Wenn Sie
webmin
dann verwenden, sind dies die Schritte zum Festlegen desPATH
Werts:quelle