Variables de entorno cuando el script python es ejecutado por cron
environment-variables (5)
He estado buscando en otras preguntas de desbordamiento de pila 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 raspadores 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 funcionar 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 intento 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 programació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
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
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.
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 programa del sistema que ejecuta un programa 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 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