Variables de entorno cuando el script python es ejecutado por cron

He estado buscando otras preguntas de desbordamiento de stack pero no pude hacer que ninguna funcionara. Tengo una secuencia de comandos de python que utiliza variables de entorno. Este script funciona exactamente como se planificó cuando se ejecuta directamente, sin embargo, me gustaría ejecutarlo como un trabajo cron cada minuto por el momento.

Actualmente en mi directorio cron.d tengo un archivo llamado “scrapers” que contiene:

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

Esto ejecuta el script de Python, pero el script falla como en el script, yo uso dos variables de entorno.

Leí que debería agregar SHELL = / bin / bash al archivo cron, así que lo hice, pero esto no ayudó.

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

Entonces leo

En el crontab, antes de mandar, agregue. $ HOME / .profile.

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

pero esto hizo que el cron dejara de correr por completo. ¿Cuál es la mejor manera de ‘enviar’ las variables env al cron?

En lugar de ejecutar todo el ~/.profile Lo que haría es mover las variables que deben compartirse entre sus trabajos cron y la cuenta que tiene el perfil, luego las ~/.profile en ~/.profile y en el cron trabajo.

El último bash que muestres en la pregunta no tiene el formato correcto. La identificación del usuario debe aparecer inmediatamente después de la información de progtwigción, pero ha agregado la fuente del perfil antes de la identificación del usuario, que seguramente no puede funcionar.

Aquí hay una configuración de ejemplo que he probado aquí:

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

Lo he configurado para ejecutarse cada minuto para propósitos de prueba. Reemplace algún someuser con algo que tenga sentido. El script /tmp/t10/setenv que usé tenía esto:

 export FOO=foovalue export BAR=barvalue 

El archivo /tmp/t10/test.py tenía esto:

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

Mi cron me envía por correo electrónico la salida de los scripts que ejecuta. Recibí un correo electrónico con esta salida:

 foovalue barvalue 

Puede establecer la variable env en línea:

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

Otra forma es usar honcho para pasar un archivo con variables env.

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

Puede especificar sus dos variables de entorno de esta manera:

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

env es un progtwig del sistema que ejecuta un progtwig específico con variables adicionales:

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

Puede agregarlo a la parte superior de su crontab y mantenerlo fuera del control de versiones. Digamos que la variable de entorno que le causa dificultades es 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 

Esto me ha funcionado bien cuando las variables de entorno en cuestión deben mantenerse en secreto y la carga de .bashrc existente no es agradable por cualquier motivo.

Este es uno de los enfoques que me gustan, escribir un script para establecer el entorno y ejecutar el script con sus parámetros como sus parámetros

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 

uso

/usr/bin/python3.5 /code/scraper.py se toma como entrada para set_env_to_process.sh set_env_to_process.sh establece la env correcta para que se ejecute el script

Podría usarse como línea de comando, cron, sudo, ssh para configurar env

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