¿Cómo puedo ejecutar un comando cron con variables ambientales existentes?
Si estoy en un indicador de shell, puedo escribir echo $ORACLE_HOME
y obtener una ruta. Esta es una de mis variables ambientales que se establece en mi ~/.profile
. Sin embargo, parece que ~/.profile
no se carga scripts fron cron y, por lo tanto, mis scripts fallan porque la $ORACLE_HOME
variable no está configurada.
En esta pregunta, el autor menciona la creación de un ~/.cronfile
perfil que configura variables para cron, y luego hace una solución para cargar todos sus comandos cron en los scripts que mantiene en su ~/Cron
directorio. Un archivo como ~/.cronfile
suena como una buena idea, pero el resto de la respuesta parece un poco engorroso y esperaba que alguien pudiera decirme una forma más fácil de obtener el mismo resultado.
Supongo que al comienzo de mis scripts podría agregar algo como, source ~/.profile
pero parece que podría ser redundante.
Entonces, ¿cómo puedo hacer que mis scripts cron carguen las variables de mi perfil de shell interactivo?
source ~/.profile
redundante agregar a un programa? Los programas heredan su entorno del programa de llamadas. Si ese programa de llamada no es su shell, ¿cómo obtendrá el programa descendiente el entorno que desea?su -l
para configurar un entorno de inicio de sesión normal que incluye $ PATH para root u otro usuario específico.Respuestas:
En el crontab, antes de ordenar, agregue
. $HOME/.profile
. Por ejemplo:Cron
no sabe nada de tu caparazón; es iniciado por el sistema, por lo que tiene un entorno mínimo. Si quieres algo, necesitas que te lo traigan.fuente
.
antes del guión? (No estoy seguro de cómo lo haríaman
). ¿Por qué es esto diferente desource
?.
comando es el comando original parasource
. Son equivalentes dentro del shell y un poco más fáciles de escribir, especialmente dentro de un crontab. Para obtener más información, escribahelp .
o busque^SHELL BUILTIN COMMANDS
en la página de manual parabash
o en la parte superior del tipoman
zshbuiltins .`. Running
le indicará que el comando está integrado..profile
por.bash_profile
. Compruebe qué.profile
archivo existe en el directorio de inicio del usuario.Otra opción, que me parece más fácil, es ejecutar el script con cron y tener el entorno en el script.
En el archivo crontab -e:
En el archivo cron_job.sh:
Cualquier comando después de la fuente de .bash_profile tendrá su entorno como si hubiera iniciado sesión.
fuente
/bin/bash
como shell. Seguía preguntándome por qué cosas comocd /path/to/project; source .vars
funcionarían cuando las escribía manualmente pero fallaban (File not found
) cuando se incluían en un cronjob. La línea clave para mí estaba configuradaSHELL=/bin/bash
para que realmente pudiera usar comandos bash familiares en cada cronjob./bin/sh/
(el shell cron predeterminado, aparentemente) es muy limitante.EnvironmentFile
unidad de servicio. Lástima que el cron no tenga algo similar.$SHELL
es así/bin/sh
, elsource
comando no existe. Usar en su.
lugar.Otra opción, que me parece más fácil, es ejecutar el script con cron y decirle a bash que inicie sesión (por lo tanto, usando
/etc/profile.d/...
definiciones de entorno)En
crontab -e
archivo:Cualquier comando después de la fuente de
.bash_profile
tendrá su entorno como si hubiera iniciado sesión.fuente
Mala idea. La práctica general es establecer específicamente todas las variables ambientales requeridas en un script que se ejecutará desde un trabajo cron.
fuente
/usr/bin/env
comando para establecer las variables y luego puede actuar como el proceso de entorno para el cronjob.envdir
viene a la mente.~/.cronvars
e incluirlo en el perfil y también en mis scripts cron. No quiero codificar variables ambientales en cada uno de los scripts que ejecuto porque cuando las rutas cambian las rutas codificadas en cada archivo no son fáciles de mantener. Parece que eso permitiría un lugar centralizado para las variables necesarias y aún así evitaría que otras variables se carguen.Esta sintaxis definitivamente te ayuda. No entiendo la sintaxis, pero funciona. Oracle utiliza esta sintaxis, cuando implementa Oracle Configuration Manager para crontab, por lo tanto, creo que esta es una solución correcta.
fuente
Recientemente me encontré con un caso en el que tenía que ejecutar el cronjob general como root pero, al mismo tiempo, tenía que ejecutar un subcomando como un usuario diferente (lo que requería obtener el entorno de ese usuario). Fui con el siguiente enfoque:
La parte crucial es el argumento al
-i
que se le pasasudo
que ejecutará el comando dado en un shell de inicio de sesión separado (lo que a su vez significa que se obtendrán los archivos de puntos del usuario).PD: Tenga en cuenta que la
user
columna solo está disponible en/etc/crontab
y los/etc/cron.d/*
archivos.fuente
La solución, que funcionó para mí, se describe aquí .
Crea una secuencia de comandos de envoltura, que llama
. ~/.cronfile
y luego hace las cosas que desea. Este script es lanzado por cron.En
~/.cronfile
usted especifique el entorno para sus trabajos cron.fuente
Sí, puede usar "soluciones alternativas bien conocidas" (algunas de las cuales se han enumerado). Esta es otra forma de decir que todo el mundo sabe que es una mierda, aunque algunas personas se referirán a esto como una "característica de seguridad" porque han gastado al menos tanto en tropezar con respecto a este fallo (ure) como usted, y les gustaría pensar que El tiempo perdido no era para nada. Es el equivalente cron del teclado QWERTY.
Sospecho que la razón original puede haber sido el rendimiento, de modo que las secuencias de comandos que se ejecutan una vez por minuto no gastarían el tiempo para leer las secuencias de comandos rc. Además, originalmente cron no era realmente configurable en absoluto, por lo que un valor predeterminado era realmente la única opción.
No hay seguridad adicional al no tener una configuración o método simple para que cron solo tome el entorno de su shell interactivo en lugar de que los usuarios tengan que realizar gimnasia estúpida. En una máquina moderna, generalmente no hay un aumento perceptible del rendimiento a menos que tenga una gran cantidad de trabajos ejecutándose cada minuto.
La cultura Unix falla. En mi humilde opinión. :-)
fuente
Añadir
al crontab. Vea cómo garantizar la disponibilidad de $ BASH_ENV
fuente
En lugar de configurar el perfil, lo que me ayudó fue configurar el
PATH
. Algunos de los comandos no estaban disponibles en mis scripts cron, ya quePATH
es diferente.Establecer
PATH
con la ruta de comandos me ayudó. Aún mejor si puedes usar una plantilla y detemplatizar después,Pasar variables a cada elemento parece desordenado.
fuente
Puse .
~/.dbus/session-bus/*
en la parte superior de mi script deseado :)fuente