He definido la variable "SHELL" en el archivo / etc / crontab:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
Además, todos mis scripts en el archivo / etc / crontab se inician bajo el usuario "martin". Sin embargo, /home/martin/.bash_profile (para el shell de inicio de sesión) y /home/martin/.bashrc (para el shell no logging) contienen algunas variables que se ignoran en caso de trabajo cron, pero se usan en caso de que inicie sesión en la máquina. SSH o abra una nueva sesión de bash. ¿Por qué cron ignora esas variables? ¿No está cron simplemente ejecutando "/ usr / local / bin / bash my-script.sh" con permisos para el usuario "martin"?
.bashrc
tiene una línea que impide que se ejecute en shells no interactivos.Respuestas:
Puede obtener el archivo que desee en la parte superior del script o al comienzo del trabajo para el usuario que está ejecutando el trabajo. El comando "fuente" está integrado. Haría lo mismo si realizara modificaciones en esos archivos para cargar los cambios.
o
fuente
bash
shell. He agregado una respuesta que puede manejar el caso cuando el shell essh
.Porque no es un shell interactivo. Lo mismo sucede cuando abres algunas terminales.
Eche un vistazo a esta pregunta: ¿Qué es el archivo .bashrc? El | Super usuario
Y también en este:
¿Cuál es la diferencia entre .bashrc, .bash_profile y .environment? El | Desbordamiento de pila
Se activan diferentes scripts según si la conexión es un shell de inicio de sesión (o no), un shell interactivo (o no), o ambos.
Si quieres hacer bashrc deberás hacer este cambio:
Fuente: Bash Startup Files | Manual de referencia de Bash | gnu.org
fuente
Es posible que no pueda ejecutar
source
sish
se está utilizando el shell. Esto se puede cambiar agregando la siguiente línea en su crontab:También puede especificar el entorno:
o puede usar su local
/home/user/.bashrc
si es un trabajo cron de usuario (por ejemplocrontab -e
).Tenga en cuenta que
.bash_profile
puede reemplazar.bashrc
, si existe.Crédito: ¿Cómo cambiar cron shell (sh a bash)?
fuente
SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
Otra cosa que podría interferir con el abastecimiento de su
.bashrc
desde un trabajo temporal es cualquier verificación que este archivo haga para detectar shells interactivos.Por ejemplo, en Ubuntu 18.04, el valor predeterminado
.bashrc
para un usuario comienza con esto:y así el abastecimiento no hará nada útil ya que saldrá inmediatamente.
fuente
Puede invocar bash con la
-l
opción, así:La
-l
opción convierte a bash en un shell de inicio de sesión . Por lo tanto, leerá el usuario.bash_profile
. No leerá al usuario a.bashrc
menos que se obtenga explícitamente.bash_profile
. Esto se debe a que los shells no interactivos no se leen automáticamente.bashrc
. Pero no debería necesitar.bashrc
un trabajo cron porque.bashrc
es para configurar cosas útiles para un shell interactivo .Variaciones:
Si bash está en la RUTA, no hay necesidad de especificar una ruta absoluta:
Una optimización sería reemplazar el shell actual mediante el uso de
exec
:fuente
bash
actúa de manera diferente si es un shell o un lenguaje de programación normal (comoperl
opython
).Por diseño, las configuraciones en
~/.bash_profile
,~/.bashrc
etc. son para que los usuarios establezcan cosas cuandobash
desempeñan el papel de un shell (shell de inicio de sesión, shell interactivo). Piense en el entorno que tiene en unxterm
(shell interactivo) o enssh
sesiones (shell de inicio de sesión) o en consolas (shell de inicio de sesión).Por otro lado,
bash
también es un poderoso lenguaje de programación, piense en muchos scripts para administrar serviciossystemd
, lo que requiere un estilo de trabajo diferente. Por ejemplo, cuando un desarrollador está escribiendo una secuencia de comandos del sistema o unbash
programa, no le gustaría obtener el usuario~/.bash_profile
automáticamente. Es un programa normal, no un shell. Un programa normal (incluidos losbash
programas) heredaría naturalmente la configuración del evironement de trabajo actual (shell), pero no la establecería .Si escribimos un programa para
cron
inbash
, resulta que está escrito enbash
; De hecho, podemos escribir enpython
operl
, o cualquier otro lenguaje programación, entonces podemos tener una opción para las fuentes debash
's~/.bash_profile
(es decir: el establecimiento de la concha del usuario, que sólo pasa a ser el mismo idioma de su lenguaje de programación):Sin embargo, ¿qué pasa si ese usuario en particular no lo usa
bash
como su shell? Él / ella puede usarzsh
,ksh
,fish
, etc Por lo tanto, esa práctica no es realmente trabajar al escribir el programa para el uso público.Por lo tanto, puede fuente
~/.bash_profile
si cree que funcionará. Pero, aquí, no se trata de si podemos obtener un archivo, se trata de cómo deberían funcionar las cosas en el sistema: el concepto de diseño . En resumen: deberíamos verlobash
como algo que tiene 2 roles: shell y lenguaje de programación . Entonces todo será mucho más fácil de entender.fuente
Tuve el mismo problema al ejecutar una aplicación de nodo desde cron que usa NVM, para hacer que bash shell lea el archivo .bashrc de cron simplemente invoque el comando bash con la opción de shell interactivo `-l.
p.ej:
* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Si eso no funciona, intente configurar la variable de ruta en crontab
fuente
Mi manera de lidiar con esto fue esto:
1) Poner mis variables en (al final de)
~/.profile
:2) Crear una secuencia de comandos Bash para mis tareas cron (diarias) (
~/cronDaily.sh
) que contienen mis comandos más un abastecimiento repetitivo de~/.profle
:3) programar la ejecución de mi script desde
crontab
, para que se ejecute diariamente:Mi variable no fue ignorada y los comandos se ejecutaron con éxito.
Algunos pueden decir que un abastecimiento tan intenso
~/.profile
es problemático. En mi caso particular, no veo por qué es un problema, pero me gustaría considerar crear un archivo dedicado para eso.En general, puede haber una mejor manera de hacerlo, pero eso es lo que funcionó para mí después de mucho dolor y explica el principio de que a partir de Bash 4.3.46, no puede obtener un archivo
crontab
.fuente