web-dev-qa-db-fra.com

Variables d'environnement lorsque le script python est exécuté par cron

J'ai examiné d'autres questions relatives au dépassement de capacité de la pile, mais je n'ai pas réussi à en faire fonctionner aucune. J'ai un script python qui utilise des variables d'environnement. Ce script fonctionne exactement comme prévu lorsqu'il est exécuté directement. Toutefois, j'aimerais le lancer comme une tâche cron toutes les minutes pour le moment.

Actuellement dans mon répertoire cron.d, j'ai un fichier appelé scrapers contenant:

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

Cela exécute le script python mais le script échoue car dans le script, j'utilise deux variables d'environnement. 

J'ai lu que je devrais ajouter Shell =/bin/bash au fichier cron, donc je l'ai fait mais cela n'a pas aidé.

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

Puis j'ai lu 

Dans la crontab, avant de commander, ajoutez. $ HOME/.profile. 

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

mais cela a provoqué l'arrêt complet du cron. Quel est le meilleur moyen "d'envoyer" les variables env au cron?

22
user6723321

Au lieu d'exécuter la totalité du ~/.profile, ce que je ferais serait de déplacer les variables à partager entre vos tâches cron et le compte associé au profil, puis de les rechercher dans ~/.profile et dans la tâche cron.

La dernière tentative que vous montrez dans la question n'est pas correctement formatée. L'identifiant de l'utilisateur devrait arriver juste après les informations de planification, mais vous avez ajouté la source du profil avant l'identifiant de l'utilisateur, ce qui ne peut sûrement pas fonctionner.

Voici un exemple de configuration que j'ai testée ici:

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

Je l'ai configuré pour exécuter chaque minute à des fins de test. Remplacez someuser par quelque chose de logique. Le script /tmp/t10/setenv que j'ai utilisé avait ceci:

export FOO=foovalue
export BAR=barvalue

Le fichier /tmp/t10/test.py avait ceci:

import os

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

Mon cron m'envoie par mail la sortie des scripts qu'il exécute. J'ai reçu un email avec cette sortie:

foovalue barvalue
5
Louis

Vous pouvez définir la variable env inline:

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

Une autre méthode consiste à utiliser honcho pour que vous puissiez passer un fichier avec des variables env.

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

3
fabiocerqueira

Vous pouvez l'ajouter en haut de votre crontab et le garder en dehors du contrôle de version. Disons que la variable d'environnement qui vous cause des difficultés est 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

mon_cool_script.sh

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

Cela a bien fonctionné pour moi lorsque les variables d'environnement en question doivent rester secrètes et que le chargement du fichier .bashrc existant ne joue pas à Nice pour une raison quelconque.

1
Scott Skiles

Vous pouvez spécifier vos deux variables d’environnement par ceci:

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

env est un programme système qui exécute un programme spécifié avec des variables supplémentaires:

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

C’est l’une des méthodes que j’aime bien, écrire un script pour définir l’environnement et exécuter le script avec ses paramètres comme paramètres.

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: $@"
    eval $@
fi

usage

/usr/bin/python3.5 /code/scraper.pysont pris comme entrée pour set_env_to_process.shset_env_to_process.sh définir le bon env pour le script à exécuter

Il pourrait être utilisé comme ligne de commande, cron, Sudo, ssh pour configurer env

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