Demandez à «cron» d'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 des liens vers 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 en utilisant une ancienne norme de codage - de nos jours, j'utiliserais un shebang '#!' Au début.)
Le '~ / .cronfile' est une variation de mon profil pour une utilisation par cron - rigoureusement non interactif et sans écho pour être bruyant. Vous pouvez organiser l'exécution du fichier .profile, etc. à la place. (La substance REAL_HOME est un artefact de mon environnement - vous pouvez prétendre que c'est la même chose que $ HOME.)
Ainsi, ce code lit l'environnement approprié, puis exécute la version non Cron de la commande à partir de mon répertoire personnel. Ainsi, par exemple, ma commande «en semaine» ressemble à:
: "@(#)$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 commande «quotidienne» 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
Jonathan Leffler
la source
J'ai une solution de plus pour ce problème:
Dans ce cas, il sélectionnera toutes les variables d'environnement définies dans votre
$HOME/.profile
fichier.Bien sûr,
$HOME
n'est pas non plus défini, vous devez le remplacer par le chemin complet de votre$HOME
.la source
source ~/.bashrc
, et il s'avère que mon.bashrc
fichier est en quelque sorte en conflit avec le travail cron. Si j'utilise un.env_setup_rc
fichier très simple avec une seule ligneexport MY_ENV_VAR=my_env_val
:, cela fonctionne réellement. Voir mon article: stackoverflow.com/questions/15557777/…La configuration de vars a
/etc/environment
également fonctionné pour moi dans Ubuntu. Depuis le 12.04, les variables dans/etc/environment
sont chargées pour cron.la source
env >> /etc/environment
et toutes les vars env actuelles sont désormais disponibles dans les tâches CRON.env >> /etc/environment
échouera s'il y a un signe de hachage dans l'une des variables d'environnement. J'ai eu le plus de mal à dépanner mon application. Il s'est avéré être un mot de passe contenant '#' qui était tronqué à cette étape.Si vous démarrez les scripts que vous exécutez via cron avec:
Ils devraient récupérer vos
~/.bash_profile
variables d'environnementla source
root
de crontab? Il n'y a pas de/home/root
dossier sur mon système et je ne vois donc pas comment cela fonctionnerait avecroot
crontab. Des idées?#!/bin/bash
. La magie ici est d'ajouter-l
Développer l'exemple de @carestad, que je trouve plus facile, est d'exécuter le script avec cron et d'avoir l'environnement dans le script.
Dans le fichier crontab -e:
Dans le fichier cron_job.sh:
Toute commande après la source de .bash_profile aura votre environnement comme si vous vous étiez connecté.
la source
Pour moi, j'ai dû définir la variable d'environnement pour une application php. Je l'ai récupéré en ajoutant le code suivant à ma crontab.
crontab:
et à l'intérieur de doSomethingWonderful.php j'ai pu obtenir la valeur de l'environnement avec:
J'espère que ça aide!
la source
Tout ce que vous définissez
crontab
sera disponible dans les cronjobs, directement et en utilisant les variables dans les scripts.Utilisez-les dans la définition du cronjob
Vous pouvez configurer de
crontab
manière à définir des variables que le cronjob peut utiliser:Maintenant, le fichier
/tmp/hello
montre des choses comme:Utilisez-les dans le script exécuté par cronjob
Vous pouvez configurer de
crontab
sorte qu'il définit des variables que les scripts peuvent ensuite utiliser:Et disons que le script
/tmp/myscript.sh
est comme ceci:Il génère un fichier
/tmp/myoutput.res
montrant:la source
Développer sur @Robert Brisita vient de se développer, également si vous ne voulez pas configurer toutes les variables du profil dans le script, vous pouvez sélectionner les variables à exporter en haut du script
Dans le fichier crontab -e:
Dans script.sh
la source
Au lieu de
Utilisez bash -l -c
la source
-l
comme ceci#!/bin/bash -l
:? Cette autre réponse est simple et élégante.J'utilise
Oh-my-zsh
dans mon macbook, j'ai donc essayé beaucoup de choses pour que la tâche crontab s'exécute, mais finalement, ma solution ajoutait.zshrc
avant l'exécution de la commande.Cette tâche s'exécute toutes les 30 minutes et utilise le
.zshrc
profil pour exécuter ma commande de nœud.N'oubliez pas d'utiliser le point avant le
$HOME
var.la source
Une autre façon - inspirée de cette réponse - d'injecter des variables est la suivante (exemple fcron):
De
help set
:Donc , tout le reste
set -
etset +
obtient exporté versenv
et est alors disponible pour d' autres scripts, etc. Sans utiliserset
les variables sont remplacées mais provenant en directset
seulement.En plus de cela, il est également utile de transmettre des variables lorsqu'un programme nécessite un compte non root pour s'exécuter, mais vous aurez besoin de certaines variables dans l'environnement de cet autre utilisateur. Vous trouverez ci-dessous un exemple de transmission de vars nullmailer pour formater l'en-tête de l'e-mail:
la source
J'ai essayé la plupart des solutions fournies, mais rien n'a fonctionné au début. Il s'avère cependant que ce ne sont pas les solutions qui n'ont pas fonctionné. Apparemment, mon
~/.bashrc
fichier commence par le bloc de code suivant:Il s'agit essentiellement d'un
case statement
qui vérifie l'ensemble d'options actuel dans le shell actuel pour déterminer que le shell fonctionne de manière interactive. Si le shell s'exécute de manière interactive, il passe ensuite au sourcing du~/.bashrc
fichier. Cependant, dans un shell appelé parcron
, la$-
variable ne contient pas lai
valeur qui indique l'interactivité. Par conséquent, le~/.bashrc
fichier n'est jamais entièrement approvisionné. Par conséquent, les variables d'environnement n'ont jamais été définies. Si cela vous arrive, n'hésitez pas à commenter le bloc de code comme suit et réessayez:J'espère que cela s'avère utile
la source
Vous pouvez également ajouter votre commande avec
env
pour injecter des variables d'environnement comme ceci:la source