la ejecución de crontab no tiene las mismas variables de entorno que la ejecución del usuario

20

Ejecuté mi trabajo crontab 0 2 */1 * * /aScript >aLog.log 2>&1como usuario 'root' y, sin embargo, encontré que el env es diferente del env del usuario 'root' y, por lo tanto, experimenta un comportamiento de tiempo de ejecución diferente de mis scripts.

Un intento de reparación fue colocar comandos de exportación en archivos rc.d, ¡pero todavía no apareció! Termino colocando comandos de exportación en el propio aScript .

Mi pregunta es: ¿hay una mejor manera de abordar este problema? y ¿por qué falta env aunque sea del mismo usuario 'root'? (Modifico crontab ejecutando 'crontab -e' desde la raíz)

Bambú
fuente
8
Cron siempre se ejecuta con un entorno mayormente vacío. HOME, LOGNAME y SHELL están configurados; y un camino muy limitado. Si no desea establecer todas las variables usted mismo, puede acceder a sourcesu perfil (bash).
cyberx86
2
@ cyberx86: ¿Por qué no escribir eso como respuesta y obtener un representante?
user9517 es compatible con GoFundMonica el
2
@Iain: el representante siempre es bienvenido, pero a veces parece que una respuesta de una línea realmente no gana el representante. Acepto completamente que una respuesta sucinta tiene su lugar, pero he estado (tal vez incorrectamente) usando comentarios como una 'salida fácil' cuando quería proporcionar ayuda, pero no escribí una explicación completa y detallada (era la 1 de la madrugada. ..). Sin embargo, tomaré su consejo y lo ampliaré un poco y lo agregaré como respuesta.
cyberx86
@ cyberx86: Es mejor tener un revestimiento correcto que incorrecto o nada.
user9517 es compatible con GoFundMonica el

Respuestas:

31

Cron siempre se ejecuta con un entorno mayormente vacío. HOME, LOGNAME y SHELL están configurados; y un camino muy limitado. Por lo tanto, es aconsejable utilizar rutas completas a los ejecutables y exportar cualquier variable que necesite en su script cuando use cron.

Hay varios enfoques que puede usar para configurar sus variables de entorno en cron, pero todas equivalen a configurarlo en su script.

Enfoque 1:

Establezca cada variable que necesita manualmente en su script.

Enfoque 2:

Fuente su perfil:

. $HOME/.bash_profile(o . $HOME/.profile)

(Por lo general, encontrará que el archivo anterior generará otros archivos (por ejemplo, ~ / .bashrc -> / etc / bashrc -> /etc/profile.d/*); si no, también puede obtenerlos).

Enfoque 3:

Guarde sus variables de entorno en un archivo (ejecute como el usuario deseado):

env > /path/to/my_env.sh

Luego importe a través de su script cron:

env - `cat /path/to/my_env.sh` /bin/sh

Enfoque 4:

En algunos casos, puede establecer variables cron globales en /etc/default/cron. Sin embargo, existe un elemento de riesgo, ya que se establecerán para todos los trabajos cron.

cyberx86
fuente
El Enfoque 2 es el mejor para servidores en los que tiene cosas sensibles que no deberían golpear el disco en los entornos: contraseñas, claves de API, etc. Funcionaron maravillas para mí, así que gracias.
ap
Enfoque 4 funcionó para mí en el entorno de Docker, donde el motor de Docker establece los entornos. Sin embargo, para que esto funcione, tuve que guardar mi env en el punto de entrada de la ventana acoplable. La solución completa está aquí: github.com/rayyanqcri/swarm-scheduler
hammady
¿Podría explicarme el enfoque 3 para mí? Cuando intento importarlo me salebash: SHELL=/bin/bash: No such file
KuboMD
1

Cron crea su propio shell con el uso especificado a través del cual se ejecutará.

Entonces, si desea mantener la misma variable de su usuario, intente ejecutarla con su propio usuario, en lugar de root o cualquier otro usuario.

O

La mejor manera es exportar esas variables en su propio script.

Farhan
fuente
1

En RedHat CentOS, puede establecer /etc/rc.d/init.d/functions default PATH para establecer permanentemente. /etc/rc.d/crond llama a funciones cuando comienza.

usuario215450
fuente
0

Tuve un problema similar en mi AWS. Lo descubrí así

which python3

me dio /usr/bin/local/python3ubicación

y entonces

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
Al Po
fuente