J'ai défini ma variable d'environnement en utilisant /etc/profile
:
export VAR=/home/userhome
Alors si je le fais echo $VAR
montre/home/userhome
Mais lorsque je mets référence à cette variable dans le /etc/init.d/servicename
fichier, il ne peut pas trouver cette variable. Quand j'exécute en service servicename status
utilisant un /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 ça marche si je cours /etc/init.d/servicename status
au lieu deservice servicename status
Comment puis-je faire en sorte qu'un service unix voie les variables d'environnement?
rc
directement le script aussi ne fonctionne pas de cette façon sur les systèmes d'exploitation systemd, comme toutes les invocations du script sont transformées en invocationssystemctl
par un crochet caché.Réponses:
Le problème est
service
bandes toutes les variables de l' environnement maisTERM
,PATH
et ceLANG
qui est une bonne chose. Si vous exécutez le script directement, rien ne supprime les variables d'environnement, donc tout fonctionne.Vous ne voulez pas vous fier à 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 le configurera probablement pas de toute façon.
Si vous souhaitez toujours utiliser de telles variables, sourcez un fichier et lisez-les, par exemple créez-les
/etc/default/servicename
avec le contenu:et le source de votre script init, par exemple:
la source
[ ... ]
est un raccourci pour un test conditionnel; voir cette réponse .-f
est unif
argument pour vérifier si le fichier existe.&&
est un opérateur de court-circuit: effectuez la deuxième commande uniquement si la première quitte avec 0..
opérateur source ou point: lisez et exécutez les commandes à partir de l'argument filename.-z
est unif
argument pour vérifier une chaîne de longueur nulle.>&2
envoyer la sortie à stderr. Voir aussi Introduction à if .-f
fait partie[
, nonif
.[ ... ]
est un raccourci pour unetest
commande conditionnelle ; voir cette réponse .-f
Est untest
argument pour vérifier si un fichier existe."[
(outest
) simplement comme une autre commande. Tout ceif
que vous avez à faire est de prendre des mesures en fonction du statut de sortie.$VAR
d'être dans le script init, j'ai besoin qu'elle soit disponible pour un programme différent 2 ou 3 appels en aval du script init. Par exemple. Le script init appelle start-stop-daemon qui appelle le programme 1 (Java) qui appelle le programme 2 dont il a besoin$VAR
. J'ai essayé le truc dans cette réponse mais cela ne semble pas fonctionner dans ma situation. Comment puis-je m'assurer qu'il$VAR
sera disponible pour le programme 2?Dans mon cas, il me fallait un
RAILS_ENV
qui a été mis en/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.la source
Une solution laide qui fonctionnera également:
la source