334 votes

Où puis-je configurer variables d’environnement qui utilise crontab ?

J’ai un crontab exécute toutes les heures. L’utilisateur qui exécute il a variabless de l’environnement la `` que travail lorsque l’utilisateur exécute le travail de la borne, cependant, évidemment ceux-ci n’obtenir ramassés par crontab lors de son exécution.

J’ai essayé les définissant dans et , mais ils ne semblent toujours pas avoir ramassé. Quelqu'un sait-il où je peux mettre environnement vars cette crontab peut ramasser ?

291voto

carestad Points 831

Vous pouvez définir des variables d'environnement dans le crontab de lui-même lors de l'exécution d' crontab -e à partir de la ligne de commande.

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

Cette fonctionnalité n'est disponible que pour certaines implémentations de cron. Ubuntu et Debian utilisent actuellement vixie-cron qui permet à ces être déclarée dans le fichier crontab (également GNU mcron).

Archlinux et RedHat utilisation cronie qui ne pas permettre à des variables d'environnement pour être déclaré et jeter les erreurs de syntaxe dans le cron.journal. Solution de contournement peut être fait par l'entrée:

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"

185voto

Vishal Points 1050

J'ai une autre solution pour ce problème:

 0 5 * * * . $HOME/.profile; /path/to/command/to/run
 

Dans ce cas, il choisira toute la variable d'environnement définie dans votre fichier $ HOME / .profile.

Bien sûr, $ HOME n'est pas non plus défini, vous devez le remplacer par le chemin complet de votre $ HOME.

93voto

Jonathan Leffler Points 299946

Ont 'cron' exécuter un script shell qui définit l'environnement avant d'exécuter la commande.

Toujours.

#   @(#)$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

Les scripts dans ~/bin/Cron sont tous les liens d'un seul script, 'runcron", qui ressemble à:

:       "$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 ${@:+"$@"}

(Écrit à l'aide d'une ancienne norme de codage - aujourd'hui, je voudrais utiliser un shebang '#!' au début.)

Le~/.cronfile " est une variation sur mon profil pour une utilisation par cron - rigoureusement non-interactive et pas d'écho pour des raisons d'être bruyant. Vous pouvez vous arranger pour exécuter la .profil et donc sur la place. (Le REAL_HOME des choses est un artefact de mon environnement, vous pouvez prétendre qu'il est le même que $à la MAISON.)

Donc, ce code lit l'environnement approprié, puis exécute la non-Cron version de la commande à partir de mon répertoire home. Ainsi, par exemple, mon "jour de la semaine' de la commande ressemble à ceci:

:       "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
#       Commands to be done each weekday

# Update ICSCOPE
n.updics

La "quotidienne", la commande est plus 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

28voto

Robert Brisita Points 557

Développer sur l'exemple de @carestad, que je trouve plus facile, consiste à exécuter le script avec cron et à avoir l'environnement dans le script.

Dans le fichier crontab -e:

 SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh
 

Dans le fichier cron_job.sh:

 #!/bin/bash
source $HOME/.bash_profile
some_other_cmd
 

Toute commande après la source de .bash_profile aura votre environnement comme si vous vous êtes connecté.

15voto

karlingen Points 975

Pour moi, je devais définir la variable d’environnement pour une application php. J’ai resloved il en ajoutant ce qui suit le code de mon crontab.

crontab :

et à l’intérieur de la doSomethingWonderful.php j’ai pu obtenir la valeur de l’environnement avec :

J’espère que cette aide !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X