it-swarm.com.de

wie man die crontab PATH Variable setzt

Ich hatte ein Problem beim Ausführen eines Skripts von crontab. Nach einigen Recherchen habe ich verstanden, dass das Problem darin besteht, dass der PATH-Parameter/sbin nicht enthält.

Ich habe nachgesehen, was es in/etc/crontab enthält:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Als Test - einfacher Cron-Job zum Drucken der PATH-Variablen:

* * * * * echo $PATH &> /root/TMP.log

die Ausgabe ist:

cat /root/TMP.log
/usr/bin:/bin

Ich verstehe dieses Verhalten nicht ... Wie setze ich die PATH-Variable ..? Oder besser - wie fügt man Pfade hinzu?

22
csny

Obwohl sie ähnlich sind, unterscheidet sich eine Benutzer-Crontab (bearbeitet mit crontab -e) von der System-Crontab (bearbeitet durch Bearbeiten von/etc/crontab) und behält einen separaten Pfad bei.

Die System-Crontab verfügt über 7 Felder, in die vor dem Befehl ein Benutzername eingefügt wird. Die Benutzer-Crontab hingegen hat nur 6 Felder, die unmittelbar nach den Zeitfeldern direkt in den Befehl eingegeben werden.

Ebenso enthält der Pfad in der System-Crontab normalerweise die Verzeichnisse/sbin, während der Pfad in der Benutzer-Crontab dies nicht tut. Wenn Sie PATH für die Benutzer-Crontab festlegen möchten, müssen Sie die PATH-Variable in der Benutzer-Crontab definieren.


Eine einfache Problemumgehung zum Hinzufügen Ihres regulären PATH in Shell-Befehlen in cron besteht darin, dass die Cronjob-Quelle Ihr Profil enthält, indem Sie bash in einer Login-Shell ausführen. zum Beispiel statt

* * * * * some command

Sie können stattdessen ausführen

* * * * * bash -lc some command

Auf diese Weise wird Ihr Profil, wenn es den Pfad oder andere Umgebungsvariablen auf etwas Besonderes setzt, auch in Ihren Befehl aufgenommen.

22
madumlao

Wenn Sie systemweite Standardpfade und andere ENV-Variablen benötigen (die in /etc/profile.d definiert sind), geben Sie einfach Folgendes ein:

* * * * * . /etc/profile; your cmd
8

Es ist möglich, den PFAD (oder andere Parameter) in der Cronjob-Zeile oder in einer einzelnen Zeile festzulegen. Sie können jedoch keine Shell-Erweiterung wie PATH=$PATH:/usr/local/bin Verwenden. Die Tilde ist jedoch für Verknüpfungen im Home-Verzeichnis zulässig.

Aus den Büchern:

Eine aktive Zeile in einer Crontab ist entweder eine Umgebungseinstellung oder ein Cron-Befehl. Eine Umgebungseinstellung hat die Form: name = value, wobei die Leerzeichen um das Gleichheitszeichen (=) optional sind und alle nachfolgenden nicht führenden Leerzeichen im Wert Teil des dem Namen zugewiesenen Werts sind. Die Wertzeichenfolge kann in Anführungszeichen (einfach oder doppelt, aber übereinstimmend) gesetzt werden, um führende oder nachfolgende Leerzeichen beizubehalten.

Weitere Informationen finden Sie unter man 5 crontab.

Das sollte also funktionieren:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
6
itsafire

Ich hatte das gleiche Problem und fand einen anderen Weg, mein Skript in crontab auszuführen. Ich denke, der einfachste Weg, Ihr Programm auszuführen, besteht darin, ein Skript zu erstellen, das cd in das Verzeichnis Ihres Programms aufnehmen kann. Rufen Sie dann Ihr Programm in diesem Skript auf.

dies ist ein Beispiel für ein Skript (Skriptname = launcher.sh):

#!bin/bash
cd /home/pi/test
Sudo python3 example.py

machen Sie dann Ihr Skript ausführbar:

chmod 755 launcher.sh

Und schließlich fügen Sie Ihr Skript zu crontab hinzu

crontab -e

und fügen Sie diese Zeile am Ende hinzu:

@reboot sh /home/pi/test/launcher.sh

(Ich habe das Programm so eingestellt, dass es bei jedem Neustart ausgeführt wird.)

0
Reyhaneh Trb