Haga que 'cron' ejecute un script de shell que establece 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 ve así:
: "$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 de mi perfil para uso de cron, rigurosamente no interactivo y sin eco por el hecho de ser ruidoso. Puede organizar la ejecución del .profile y así sucesivamente. (El material REAL_HOME es un artefacto de mi entorno; puede fingir que es lo mismo que $ HOME).
Entonces, este código lee el entorno apropiado y luego ejecuta la versión del comando que no es Cron desde mi directorio de inicio. Entonces, por ejemplo, mi comando 'día de la semana' se ve así:
: "@(#)$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
Tengo una solución más para este problema:
En este caso, elegirá todas las variables de entorno definidas en su
$HOME/.profile
archivo.Por supuesto,
$HOME
tampoco está configurado, debe reemplazarlo con la ruta completa de su$HOME
.fuente
source ~/.bashrc
, y resulta que mi.bashrc
archivo está en conflicto con el trabajo cron. Si uso un.env_setup_rc
archivo muy simple con solo una línea:export MY_ENV_VAR=my_env_val
en realidad funciona. Vea mi publicación: stackoverflow.com/questions/15557777/…Configurar vars
/etc/environment
también funcionó para mí en Ubuntu. A partir de 12.04, las variables en/etc/environment
se cargan para cron.fuente
env >> /etc/environment
y todos los entornos actuales ya están disponibles en los trabajos de CRON.env >> /etc/environment
FALLARÁ si hay un signo hash en una de las variables de entorno. Me costó mucho solucionar problemas de mi aplicación. Resultó ser una contraseña que contenía '#' que se estaba truncando en ese paso.Si inicia los scripts que está ejecutando a través de cron con:
Deberían recoger
~/.bash_profile
las variables de entorno.fuente
root
el crontab? No hay una/home/root
carpeta en mi sistema, así que no veo cómo funcionaría esto conroot
el crontab. Ideas?#!/bin/bash
. La magia aquí es agregar-l
Expandir 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:
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
Para mí tuve que establecer la variable de entorno para una aplicación php. Lo reservé agregando el siguiente código a mi crontab.
crontab:
y dentro de doSomethingWonderful.php podría obtener el valor del entorno con:
¡Espero que esto ayude!
fuente
Lo que establezca
crontab
estará disponible en los cronjobs, tanto directamente como usando las variables en los scripts.Úsalos en la definición del cronjob
Puede configurarlo
crontab
para que establezca variables que luego el cronjob puede usar:Ahora el archivo
/tmp/hello
muestra cosas como:Úsalos en el script ejecutado por cronjob
Puede configurar
crontab
para que establezca variables que luego los scripts pueden usar:Y decir guión
/tmp/myscript.sh
es así:Genera un archivo que
/tmp/myoutput.res
muestra:fuente
Expandir en @Robert Brisita se acaba de expandir, 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:
En script.sh
fuente
En vez de
Usa bash -l -c
fuente
-l
siguiente aspecto#!/bin/bash -l
:? Esta otra respuesta es simple y elegante.Estoy usando
Oh-my-zsh
mi Macbook, así que he intentado muchas cosas para ejecutar la tarea crontab, pero finalmente, mi solución fue anteponer.zshrc
el comando anterior a ejecutar.Esta tarea se ejecuta cada 30 minutos y usa el
.zshrc
perfil para ejecutar mi comando de nodo.No olvides usar el punto antes de la
$HOME
var.fuente
Otra forma, inspirada por esta respuesta , de "inyectar" variables es la siguiente (ejemplo de fcron):
De
help set
:Por lo tanto, todo lo que está en el medio
set -
yset +
se exporta a,env
y luego está disponible para otros scripts, etc. Sin usarset
las variables, se obtienen pero vivenset
solo.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:
fuente
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
~/.bashrc
archivo comienza con el siguiente bloque de código:Básicamente, esto es un
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, entonces se pasa a la fuente del~/.bashrc
archivo. Sin embargo, en un shell invocado porcron
, la$-
variable no contiene eli
valor que indica interactividad. Por lo tanto, el~/.bashrc
archivo nunca se obtiene completamente. Como resultado, las variables de entorno nunca se configuraron. Si este es su problema, no dude en comentar el bloque de código de la siguiente manera e intente nuevamente:Espero que esto resulte útil
fuente
También puede anteponer su comando
env
para inyectar variables de entorno de esta manera:fuente