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"?

.bashrctiene 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
bashshell. 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
sourcesishse 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/.bashrcsi es un trabajo cron de usuario (por ejemplocrontab -e).Tenga en cuenta que
.bash_profilepuede 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
.bashrcdesde un trabajo temporal es cualquier verificación que este archivo haga para detectar shells interactivos.Por ejemplo, en Ubuntu 18.04, el valor predeterminado
.bashrcpara un usuario comienza con esto:y así el abastecimiento no hará nada útil ya que saldrá inmediatamente.
fuente
Puede invocar bash con la
-lopción, así:La
-lopció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.bashrcmenos 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.bashrcun trabajo cron porque.bashrces 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
bashactúa de manera diferente si es un shell o un lenguaje de programación normal (comoperlopython).Por diseño, las configuraciones en
~/.bash_profile,~/.bashrcetc. son para que los usuarios establezcan cosas cuandobashdesempeñ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 ensshsesiones (shell de inicio de sesión) o en consolas (shell de inicio de sesión).Por otro lado,
bashtambié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 unbashprograma, no le gustaría obtener el usuario~/.bash_profileautomáticamente. Es un programa normal, no un shell. Un programa normal (incluidos losbashprogramas) heredaría naturalmente la configuración del evironement de trabajo actual (shell), pero no la establecería .Si escribimos un programa para
croninbash, resulta que está escrito enbash; De hecho, podemos escribir enpythonoperl, 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
bashcomo 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_profilesi 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 verlobashcomo 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
~/.profilees 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