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?
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
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.