web-dev-qa-db-fra.com

Comment faire pour que le service Unix voit les variables d'environnement?

J'ai défini ma variable d'environnement à l'aide de /etc/profile:

export VAR=/home/userhome

Alors si je fais echo $VAR ça montre /home/userhome

Mais quand je mets la référence à cette variable dans le /etc/init.d/servicename fichier, il ne trouve pas cette variable. Quand je lance service servicename status en utilisant /etc/init.d/servicename fichier avec le contenu suivant:

case "$1" in
status)    
    cd $VAR/dir
    ;;
esac

ça dit /dir: No such file or directory

Mais cela fonctionne si je lance /etc/init.d/servicename status au lieu de service servicename status

Comment puis-je faire en sorte que le service Unix voit les variables d'environnement?

52
altern

Le problème est que service supprime toutes les variables d'environnement mais TERM, PATH et LANG ce qui est une bonne chose. Si vous exécutez directement le script, rien ne supprime les variables d'environnement, donc tout fonctionne.

Vous ne voulez pas compter sur des variables d'environnement externes car au démarrage, la variable d'environnement n'est probablement pas présente et votre système init ne la définira probablement pas de toute façon.

Si vous souhaitez toujours vous fier à ces variables, sourcez un fichier et lisez-en les variables, par ex. créer /etc/default/servicename avec le contenu:

VAR=value

et sourcez-le à partir de votre script init, par exemple:

[ -f /etc/default/service-name ] && . /etc/default/service-name

if [ -z "$VAR" ] ;  then
  echo "VAR is not set, please set it in /etc/default/service-name" >&2
  exit 1
fi

case "$1" in
status)    
    cd "$VAR"/dir
    ;;
esac
70
Ulrich Dangel

Dans mon cas, j'avais besoin d'un Rails_ENV Défini dans /etc/bash.bashrc: export Rails_ENV=staging. J'ai ajouté $(grep Rails_ENV /etc/bash.bashrc) et cela a rendu la variable disponible pour le script. Je l'ai fait de cette façon, donc je n'ai pas eu à inclure le reste du fichier.

1
geermc4