ver variable usuario usar que entorno editar directorio crear contiene como agregar absoluto linux unix environment-variables crontab

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.