Die Ausführung von crontab hat nicht die gleichen Umgebungsvariablen wie der ausführende Benutzer

20

Ich habe meinen crontab-Job 0 2 */1 * * /aScript >aLog.log 2>&1als 'root'-Benutzer ausgeführt und festgestellt, dass sich die env von der env des' root'-Benutzers unterscheidet und daher ein anderes Laufzeitverhalten meiner Skripte auftritt.

Ein Fehlerbehebungsversuch platzierte Exportbefehle in rc.d-Dateien, die jedoch immer noch nicht angezeigt wurden. Am Ende platziere ich Exportbefehle im aScript selbst.

Meine Frage ist, dass es einen besseren Weg gibt, um dieses Problem anzugehen? und warum fehlt env, obwohl es vom selben Benutzer 'root' stammt? (Ich ändere crontab, indem ich 'crontab -e' vom root aus starte.)

Bambus
quelle
8
Cron läuft immer mit einer meist leeren Umgebung. HOME, LOGNAME und SHELL sind eingestellt. und ein sehr begrenzter Pfad. Wenn Sie nicht alle Variablen selbst festlegen möchten, können Sie möglicherweise sourceIhr (Bash-) Profil ändern.
cyberx86
2
@ cyberx86: Warum schreibst du das nicht als Antwort auf und bekommst einen Vertreter?
user9517 unterstützt GoFundMonica
2
@Iain: rep ist immer willkommen - aber manchmal fühlt es sich so an, als würde eine einzeilige Antwort den rep nicht wirklich verdienen. Ich bin völlig damit einverstanden, dass eine prägnante Antwort ihren Platz hat, aber ich habe (möglicherweise fälschlicherweise) Kommentare als "einfachen Ausweg" verwendet, als ich etwas Hilfe leisten wollte, aber keine vollständige, detaillierte Erklärung verfassen wollte (es war 1 Uhr morgens). ..). Ich werde jedoch Ihren Rat annehmen und diesen ein wenig erweitern und ihn als Antwort hinzufügen.
cyberx86
@ cyberx86: Lieber einen richtigen Liner als einen falschen oder gar nichts.
user9517 unterstützt GoFundMonica

Antworten:

31

Cron läuft immer mit einer meist leeren Umgebung. HOME, LOGNAME und SHELL sind eingestellt; und ein sehr begrenzter Pfad. Es ist daher ratsam, vollständige Pfade zu ausführbaren Dateien zu verwenden und alle Variablen zu exportieren, die Sie in Ihrem Skript benötigen, wenn Sie cron verwenden.

Es gibt verschiedene Ansätze, mit denen Sie Ihre Umgebungsvariablen in cron festlegen können. Sie können sie jedoch alle in Ihrem Skript festlegen.

Ansatz 1:

Stellen Sie jede Variable ein, die Sie manuell in Ihrem Skript benötigen.

Ansatz 2:

Geben Sie Ihr Profil an:

. $HOME/.bash_profile(oder . $HOME/.profile)

(Normalerweise werden Sie feststellen, dass die obige Datei andere Dateien enthält (z. B. ~ / .bashrc -> / etc / bashrc -> /etc/profile.d/*). Andernfalls können Sie diese ebenfalls verwenden.)

Ansatz 3:

Speichern Sie Ihre Umgebungsvariablen in einer Datei (als gewünschter Benutzer ausführen):

env > /path/to/my_env.sh

Dann importieren Sie über Ihr Cron-Skript:

env - `cat /path/to/my_env.sh` /bin/sh

Ansatz 4:

In einigen Fällen können Sie globale Cron-Variablen festlegen /etc/default/cron. Dies birgt jedoch ein gewisses Risiko, da diese für alle Cronjobs festgelegt werden.

cyberx86
quelle
Ansatz 2 ist am besten für Server geeignet, auf denen Sie vertrauliche Dinge haben, die nicht auf die Festplatte in Umgebungsvariablen gelangen sollten - Passwörter, API-Schlüssel usw. Wirkten Wunder für mich, also danke.
ap
Ansatz 4 funktionierte für mich in einer Docker-Umgebung, in der die Docker-Engine Umgebungsvariablen festlegt. Damit dies jedoch funktioniert, musste ich mein Env im Docker-Entypoint speichern. Die vollständige Lösung finden Sie hier: github.com/rayyanqcri/swarm-scheduler
hammady
Könnten Sie Ansatz 3 für mich näher erläutern? Wenn ich versuche, es zu importieren, bash: SHELL=/bin/bash: No such file
erhalte
1

Cron erstellt seine OWN-Shell unter der angegebenen Verwendung, unter der sie ausgeführt wird.

Wenn Sie also dieselbe Variable Ihres Benutzers beibehalten möchten, versuchen Sie, sie mit Ihrem eigenen Benutzer anstelle von root oder einem anderen Benutzer auszuführen.

Oder

Am besten exportieren Sie diese Variablen in Ihr eigenes Skript.

Farhan
quelle
1

In RedHat CentOS können Sie /etc/rc.d/init.d/functions default PATH dauerhaft festlegen. /etc/rc.d/crond ruft beim Start Funktionen auf.

user215450
quelle
0

Ich hatte ein ähnliches Problem mit meiner AWS. Fand es so heraus

which python3

gab mir den /usr/bin/local/python3Standort

und dann

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
Al Po
quelle