it-swarm.com.de

Die Ausführung von crontab hat nicht die gleichen Umgebungsvariablen wie die Ausführung des Benutzers

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

Bei einem Versuch, Fehler zu beheben, wurden Exportbefehle in rc.d-Dateien platziert, die jedoch immer noch nicht angezeigt wurden. Am Ende platziere ich Exportbefehle im aScript selbst.

Meine Frage ist, ob 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' von der Wurzel aus starte.)

24
Bamboo

Cron läuft immer mit einer meist leeren Umgebung. HOME, LOGNAME und Shell werden gesetzt; und ein sehr begrenztes PATH. 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, die jedoch alle dem Festlegen in Ihrem Skript entsprechen.

Ansatz 1 :

Legen Sie jede benötigte Variable manuell in Ihrem Skript fest.

Ansatz 2 :

Quelle dein Profil:

. $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/*) - wenn nicht, können Sie diese auch als Quelle verwenden .)

Ansatz 3 :

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

env > /path/to/my_env.sh

Importieren Sie dann ü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 in /etc/default/cron Festlegen. Dies birgt jedoch ein gewisses Risiko, da diese für alle cron Jobs festgelegt werden.

35
cyberx86

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.

1
user215450

Cron erstellt seine EIGENE Shell mit der angegebenen Verwendung, über die es 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

Der beste Weg ist, diese Variablen in Ihr eigenes Skript zu exportieren.

1
Farhan

Ich hatte ein ähnliches Problem mit meinem AWS. Ich habe es so herausgefunden

which python3

gab mir /usr/bin/local/python3 Standort

und dann

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