it-swarm.com.de

Umgebungsvariablen, wenn ein Python-Skript von cron ausgeführt wird

Ich habe mir andere Stapelüberlauffragen angesehen, konnte aber keine Arbeit bekommen. Ich habe ein Python-Skript, das Umgebungsvariablen verwendet. Dieses Skript funktioniert genau wie geplant, wenn es direkt ausgeführt wird. Ich möchte es jedoch vorerst jede Minute als Cron-Job ausführen.

Derzeit habe ich in meinem cron.d-Verzeichnis eine Datei namens scrapers, die Folgendes enthält:

* * * * * root /usr/bin/python3.5 /code/scraper.py

Dadurch wird das Python-Skript ausgeführt, das jedoch fehlschlägt, da im Skript zwei Umgebungsvariablen verwendet werden. 

Ich habe gelesen, dass ich Shell =/bin/bash zur cron-Datei hinzufügen sollte, aber das hat nicht geholfen.

Shell=/bin/bash
* * * * * root /usr/bin/python3.5 /code/scraper.py

Dann habe ich gelesen 

Fügen Sie in der Crontab, bevor Sie den Befehl ausführen. $ HOME/.profile. 

Shell=/bin/bash
* * * * * . $HOME/.profile; root /usr/bin/python3.5 /code/scraper.py

dies führte jedoch dazu, dass der Cron überhaupt nicht mehr laufen konnte. Was ist der beste Weg, die env-Variablen an den cron zu senden?

22
user6723321

Anstatt den gesamten ~/.profile auszuführen, verschieben Sie die Variablen, die zwischen Ihren cron-Jobs und dem Konto, das das Profil enthält, gemeinsam genutzt werden müssen. Dann würde ich diese sowohl in ~/.profile als auch im Cron-Job angeben.

Der letzte Versuch, den Sie in der Frage anzeigen, ist nicht richtig formatiert. Die Benutzer-ID sollte unmittelbar nach den Planungsinformationen angezeigt werden, Sie haben jedoch die Sourcing-Funktion des Profils vor der Benutzer-ID hinzugefügt, was sicherlich nicht funktioniert.

Hier ist ein Beispiel, das ich hier getestet habe:

*/1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py

Ich habe es eingestellt, um jede Minute zu Testzwecken auszuführen. Ersetzen Sie someuser durch etwas sinnvolles. Das /tmp/t10/setenv-Skript, das ich verwendete, hatte folgendes:

export FOO=foovalue
export BAR=barvalue

Die /tmp/t10/test.py-Datei hatte folgendes:

import os

print os.environ["FOO"], os.environ["BAR"]

Mein cron sendet mir eine E-Mail mit der Ausgabe der Skripts, die er ausführt. Ich habe eine E-Mail mit dieser Ausgabe erhalten:

foovalue barvalue
5
Louis

Sie können die env-Variable inline setzen:

* * * * * root ENV_VAR=VALUE /usr/bin/python3.5 /code/scraper.py

Eine andere Möglichkeit ist die Verwendung von honcho , mit der Sie eine Datei mit env-Variablen übergeben können.

honcho -e /path/to/.env run /code/scraper.py

3
fabiocerqueira

Sie können es oben in Ihre Crontab hinzufügen und außerhalb der Versionskontrolle bleiben. Nehmen wir an, die Umgebungsvariable, die Sie verursacht, ist export Django_SECRET_KEY="FOOBAR_1241243124312341234":

crontab

Django_SECRET_KEY="FOOBAR_1241243124312341234"

SCRIPT_NAME = my_cool_script
20 21 * * 1-5 bash ~/git_repo/cronjobs/$SCRIPT_NAME.sh 2&>1 | tee ~/git_repo/cronjobs/logs/$SCRIPT_NAME.log

my_cool_script.sh

#!/usr/bin/env bash
~/anaconda3/envs/Django/bin/python ~/git_repo/Django_project/manage.py run_command

Dies hat für mich gut funktioniert, wenn die fraglichen Umgebungsvariablen geheim gehalten werden müssen und das Laden der vorhandenen .bashrc aus irgendeinem Grund nicht Nice spielt.

1
Scott Skiles

Sie können Ihre beiden Umgebungsvariablen folgendermaßen angeben:

* * * * * root env A=1 B=2 /usr/bin/python3.5 /code/scraper.py

env ist ein Systemprogramm, das ein angegebenes Programm mit zusätzlichen Variablen ausführt:

$ env A=1 B=2 /bin/sh -c 'echo $A$B'  # or just 'sh': would search in $PATH
12
1
Kirill Bulygin

Dies ist eine der Methoden, die ich mag: Schreiben Sie ein Skript, um die Umgebung festzulegen, und führen Sie das Skript mit seinen Parametern als Parametern aus

set_env_to_process.sh

#!/usr/bin/env bash
echo "TEST_VAR before export is: <$TEST_VAR>"

export TEST_VAR=/opt/loca/netcdf
echo "TEST_VAR after export is: <$TEST_VAR>"
export PATH=$PATH:/usr/bin/python3.5
export PYTHTONPATH=$PYTHONPATH:/my/installed/pythonpath

# execute command and its parameters as input for this script
if [ $# -eq 0 ]; then
    echo "No command to execute"
else
    echo "Execute commands with its parameters: [email protected]"
    eval [email protected]
fi

verwendungszweck

/usr/bin/python3.5 /code/scraper.pywird als Eingabe für set_env_to_process.shset_env_to_process.sh verwendet, und die richtige Umgebung für die Ausführung des Skripts festgelegt

Es kann als Kommandozeile, cron, Sudo, ssh verwendet werden, um env einzustellen

 * * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py
0
Gang