linux - usuario - ¿Dónde puedo configurar las variables de entorno que utilizará crontab?
variables linux (12)
En lugar de
0 * * * * sh /my/script.sh
Utilice bash -l -c
0 * * * * bash -l -c ''sh /my/script.sh''
Tengo un crontab corriendo cada hora. El usuario que lo ejecuta tiene un entorno variabless en el .bash_profile
que funciona cuando el usuario ejecuta el trabajo desde el terminal, sin embargo, obviamente, crontab no los detecta cuando se ejecuta.
He intentado colocarlos en .profile
y .bashrc
pero todavía no parecen ser recogidos. ¿Alguien sabe dónde puedo poner las variables de entorno que crontab puede recoger?
Establecer vars en /etc/environment
también me funcionó en Ubuntu. A partir de 12.04, las variables en / etc / environment se cargan para cron.
Expandir en el ejemplo de @carestad, 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:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
En el archivo cron_job.sh:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
Cualquier comando después de la fuente de .bash_profile tendrá su entorno como si hubiera iniciado sesión.
Haga que ''cron'' ejecute un script de shell que establezca el entorno antes de ejecutar el comando.
Siempre.
# @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
# Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min Hour Day Month Weekday Command
#-----------------------------------------------------------------------------
0 * * * * /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1 1 * * * /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2 3 * * 0 /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21 3 1 * * /usr/bin/ksh /work1/jleffler/bin/Cron/monthly
Los scripts en ~ / bin / Cron son todos enlaces a un solo script, ''runcron'', que se parece a:
: "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
# Commands to be performed by Cron (no debugging options)
# Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile
base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base
if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi
exec $cmd ${@:+"$@"}
(Escrito usando un estándar de codificación más antiguo - hoy en día, usaría un shebang ''#!'' Al principio.)
El ''~ / .cronfile'' es una variación en mi perfil para uso de cron - rigurosamente no interactivo y sin eco por el simple hecho de ser ruidoso. Podrías hacer arreglos para ejecutar el .profile y así sucesivamente. (Las cosas de REAL_HOME son un artefacto de mi entorno, puedes pretender que es lo mismo que $ HOME).
Por lo tanto, este código lee el entorno apropiado y luego ejecuta la versión que no es de Cron del comando desde mi directorio de inicio. Entonces, por ejemplo, mi comando ''día de la semana'' se parece a:
: "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
# Commands to be done each weekday
# Update ICSCOPE
n.updics
El comando ''diario'' es más simple:
: "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
# Commands to be done daily
# Nothing -- most things are done on weekdays only
exit 0
La expansión en @Robert Brisita acaba de expandirse, también si no desea configurar todas las variables del perfil en el script, puede seleccionar las variables para exportar en la parte superior del script
En el archivo crontab -e:
SHELL=/bin/bash
*/1 * * * * /Path/to/script/script.sh
En script.sh
#!/bin/bash
export JAVA_HOME=/path/to/jdk
some-other-command
Lo que establezca en crontab
estará disponible en los cronjobs, tanto directamente como usando las variables en los scripts.
Utilízalos en la definición del cronjob.
Puede configurar crontab
para que establezca variables que luego puede usar el cronjob:
$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello
Ahora el archivo /tmp/hello
muestra cosas como:
$ cat /tmp/hello
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016
Utilízalos en el script ejecutado por cronjob.
Puede configurar crontab
para que establezca variables que luego los scripts pueden usar:
$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh
Y digamos que el script /tmp/myscript.sh
es así:
echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res
Genera un archivo /tmp/myoutput.res
muestra:
$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...
Otra forma - inspirada por esta respuesta - para "inyectar" las variables es la siguiente (ejemplo de fcron):
%daily 00 12 /
set -a; /
. /path/to/file/containing/vars; /
set +a; /
/path/to/script/using/vars
De help set
:
-a Marcar las variables que se modifican o crean para exportar.
Usar + en lugar de - hace que estas banderas se desactiven.
Por lo tanto, todo lo que se encuentra entre set -
y set +
se exporta a env
y luego está disponible para otros scripts, etc. Sin usar set
las variables se originan, pero viven solo en set
.
Aparte de eso, también es útil pasar variables cuando un programa requiere una cuenta no root para ejecutarse, pero necesitaría algunas variables dentro del entorno de ese otro usuario. A continuación se muestra un ejemplo que pasa en vars nullmailer para formatear el encabezado del correo electrónico:
su -s /bin/bash -c "set -a; /
. /path/to/nullmailer-vars; /
set +a; /
/usr/sbin/logcheck" logcheck
Para mí tuve que establecer la variable de entorno para una aplicación php. Lo resolví agregando el siguiente código a mi crontab.
$ sudo crontab -e
crontab
ENVIRONMENT_VAR=production
* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
y dentro de doSomethingWonderful.php podría obtener el valor del entorno con:
<?php
echo $_SERVER[''ENVIRONMENT_VAR'']; # => "production"
¡Espero que esto ayude!
Probé la mayoría de las soluciones proporcionadas, pero nada funcionó al principio. Sin embargo, resulta que no fueron las soluciones las que no funcionaron. Aparentemente, mi archivo ~/.bashrc
comienza con el siguiente bloque de código:
case $- in
*i*) ;;
*) return;;
esac
Básicamente, se trata de una case statement
que comprueba el conjunto actual de opciones en el shell actual para determinar que el shell se ejecuta de forma interactiva. Si el shell se está ejecutando de forma interactiva, pasa a ~/.bashrc
archivo ~/.bashrc
. Sin embargo, en un shell invocado por cron
, la variable $-
no contiene el valor i
que indica interactividad. Por lo tanto, el archivo ~/.bashrc
nunca se obtiene completamente. Como resultado, las variables de entorno nunca se establecieron. Si este es su problema, no dude en comentar el bloque de código de la siguiente manera e intente nuevamente:
# case $- in
# *i*) ;;
# *) return;;
# esac
Espero que esto resulte útil
Puede definir variables de entorno en el propio crontab cuando ejecute crontab -e
desde la línea de comandos.
LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h dom mon dow command
* * * * * sleep 5s && echo "yo"
Esta característica solo está disponible para ciertas implementaciones de cron. Ubuntu y Debian actualmente usan vixie-cron que permite que estos se declaren en el archivo crontab (también GNU mcron ).
Archlinux y RedHat utilizan cronie que no permite declarar variables de entorno y arrojará errores de sintaxis en cron.log. La solución puede hacerse por entrada:
# m h dom mon dow command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
Si inicia los scripts que está ejecutando a través de cron con:
#!/bin/bash -l
Deben recoger sus variables de entorno ~ / .bash_profile
Tengo una solución más para este problema:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
En este caso, seleccionará todas las variables de entorno definidas en su archivo $ HOME / .profile.
Por supuesto, $ HOME tampoco está configurado, debe reemplazarlo con la ruta completa de su $ HOME.