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?
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
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
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"
:
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
#!/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.
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
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.py
sont pris comme entrée pour set_env_to_process.sh
set_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