wie man die Variable crontab PATH setzt

17

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 nachgeschaut, was es in / etc / crontab beinhaltet:

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?

csny
quelle

Antworten:

17

Während sie ähnlich sind, unterscheidet sich ein Benutzer crontab (bearbeitet mit crontab -e) von der System-crontab und behält einen separaten Pfad bei (bearbeitet mit / etc / crontab).

Die System-Crontab enthält 7 Felder, in die vor dem Befehl ein Benutzername eingefügt wird. Der Benutzer crontab hat dagegen nur 6 Felder, die direkt nach den Zeitfeldern in den Befehl eingehen.

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


Eine einfache Umgehung für das Hinzufügen Ihres regulären PATH in Shell-Befehlen in cron besteht darin, die Cronjob-Quelle in Ihrem Profil anzugeben, indem Sie bash in einer Login-Shell ausführen. zum Beispiel statt

* * * * * some command

Sie können stattdessen laufen

* * * * * bash -lc some command

Auf diese Weise wird Ihr Befehl auch dann berücksichtigt, wenn Ihr Profil den Pfad oder andere Umgebungsvariablen auf etwas Besonderes setzt.

Madumlao
quelle
Danke, das erklärt es ... Aber auf diese Weise kann ich nur den PATH setzen und nicht editieren, weil PATH = / sbin: $ PATH oder ähnliches nicht funktioniert. Ich habe versucht ...
csny
Ja, in einem solchen Fall müssten Sie den PATH von Grund auf neu definieren. Dies sollte einfach genug sein, da Sie alle Befehle kennen, die in Ihrer crontab ausgeführt werden. Sie müssen diese also nur berücksichtigen.
Bohnen
@madumlao bash -lchilft nicht. Im Moment kann ich PATH manuell einstellen, aber wenn ich einige Skripte installiere, möchte ich, dass sie in Cronjobs erkannt werden, ohne dass vollständige Pfade angegeben werden. Ich bin sicher, es ist irgendwie möglich und bash -lcist auf dem Weg zu einer Lösung :)
csny
4
bash -lc startet eine Login-Shell, die das Profil Ihres Benutzers abruft. Dies bedeutet, dass der Pfad verwendet wird, der in ~ / .bash_profile, ~ / .profile oder ~ / .bashrc festgelegt wurde. Haben Sie den Pfad dort festgelegt? Wenn ja und es funktioniert schlecht aktualisieren meine Antwort darauf
Madumlao
Groß. Vielen Dank Madunlao. Nachdem ich den Ordner bin file manuell zu ~ / .bash_profile hinzugefügt habe, funktioniert mein Cronjob einwandfrei.
30.
7

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

* * * * * . /etc/profile; your cmd
Vladislav Savchuk
quelle
3

Es ist möglich, den PATH (oder andere Parameter) in der Cronjob-Zeile oder in einer einzelnen Zeile einzustellen. Aber Sie sind nicht in der Lage, Shell-Erweiterung wie zu verwenden PATH=$PATH:/usr/local/bin. Die Tilde ist jedoch für Verknüpfungen zum Basisverzeichnis 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 in value Teil des Werts sind, der name zugewiesen wurde. Die Wertzeichenfolge kann in Anführungszeichen (einfach oder doppelt, aber übereinstimmend) gesetzt werden, um führende oder nachfolgende Leerzeichen beizubehalten.

Siehe man 5 crontabfür weitere Informationen.

Das sollte also funktionieren:

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

Ich hatte das gleiche Problem und fand eine andere Möglichkeit, mein Skript in Crontab auszuführen. Ich denke, die einfachste Möglichkeit, Ihr Programm auszuführen, besteht darin, ein Skript zu erstellen , das in das Verzeichnis Ihres Programms aufgenommen werden 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

Dann machen Sie Ihr Skript ausführbar:

chmod 755 launcher.sh

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

crontab -e

und füge diese Zeile am Ende hinzu:

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

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

Reyhaneh Trb
quelle