2017-02-08 1 views
19

Ich habe andere Stapelüberlauf Fragen, aber konnte nicht zur Arbeit zu bekommen. Ich habe ein Python-Skript, das Umgebungsvariablen verwendet. Dieses Skript funktioniert genau wie geplant, wenn es direkt ausgeführt wird, aber ich möchte es vorerst jede Minute als Cron-Job ausführen.Umgebungsvariablen, wenn Python-Skript von Cron ausgeführt

Zeit in meinem cron.d Verzeichnis habe ich eine Datei mit genannt Schaber:

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

Dies führt den Python-Skript, aber das Skript nicht wie im Skript, das ich zwei Umgebungsvariablen verwenden.

Ich lese ich sollte SHELL =/bin/bash zur Cron-Datei hinzufügen, so tat ich, aber das hat nicht geholfen.

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

Dann las ich

Im crontab, bevor Sie befehlen, hinzufügen. $ HOME/.Profil.

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

aber dies verursacht die cron insgesamt laufen zu stoppen. Was ist der beste Weg, die Env-Variablen an den Cron zu senden?

+0

Versuchen Sie 'source ~/.bashrc && command' oder die Datei, in der Ihre env-Variablen deklariert sind, zu sehen, ob es funktioniert. – franklinsijo

+0

@franklinsijo Sorry, ich bin mir nicht sicher, was ich tun soll. Die env-Variablen werden beim Einrichten der Container in der docker-compose-Datei deklariert. –

+0

und diese Variablen werden von scraper.py verwendet? – franklinsijo

Antwort

2

Sie können die Umgebungsvariable Inline-Set:

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

Ein anderer Weg ist honcho verwenden, die Sie eine Datei mit env Variablen passieren können.

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

+0

Gibt es eine Möglichkeit, alle env-Werte durch den Cron passieren zu lassen? –

+0

Env-Variablen werden vom übergeordneten Prozess geerbt. – fabiocerqueira

3

Anstatt die ganzen ~/.profile auszuführen, was ich tun würde, ist die Variablen bewegen, die zwischen Ihren cron Arbeitsplätzen und dem Konto, das das Profil hat, dann würde ich beziehe diese beide in ~/.profile geteilt werden muss und im Cron-Job.

Der letzte in der Frage angezeigte Versuch ist nicht richtig formatiert. Die Benutzer-ID sollte direkt nach den Planungsinformationen kommen, aber Sie haben das Sourcing des Profils vor der Benutzer-ID hinzugefügt, was sicherlich nicht funktionieren kann.

Hier ist ein Beispiel-Setup, das ich hier getestet haben:

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

ich es eingestellt habe jede Minute zu Testzwecken auszuführen. Ersetzen Sie someuser durch etwas, das Sinn macht. Das /tmp/t10/setenv Skript, das ich verwendet wurde, hatte dies:

export FOO=foovalue 
export BAR=barvalue 

Die /tmp/t10/test.py Datei dies hatte:

import os 

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

Meine cron E-Mails mir die Ausgabe der Skripte es läuft.Ich habe eine E-Mail mit diesem Ausgang:

foovalue barvalue 
+0

'setenv && test.py', entspricht einem Systemaufruf von' test.py' in 'setenv', es wird und sollte auf jeden Fall funktionieren, besser als meiner, Systemaufruf von test.py in eine Datei zu stellen. Ich mag diesen Ansatz. – Gang

+0

Danke, es hat auch perfekt für mich funktioniert. Sehr nützlicher Beitrag. –

1

Sie können Ihre zwei Umgebungsvariablen durch diese angeben:

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

env ist ein Systemprogramm, das ein bestimmtes Programm mit zusätzlichen Variablen lautet:

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

mit 2 vars in env, sollte dies funktionieren. – Gang

0

Dies ist einer der Ansätze, die ich mag, schreiben Sie ein Skript zum Festlegen der Umgebung und führen Sie das Skript mit seinen Parametern als Parameter

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 

Nutzung

/usr/bin/python3.5 /code/scraper.py als Eingabe genommen werden für set_env_to_process.sh set_env_to_process.sh die richtige env für Skript gesetzt

laufen Sie als Befehlszeile verwendet werden könnte, cron, sudo , ssh zum Einrichten von env

* * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py 
Verwandte Themen