Proměnnou prostředí jsem nastavil pomocí /etc/profile
:
export VAR=/home/userhome
Pak pokud ano echo $VAR
ukazuje /home/userhome
Ale když jsem vložil odkaz na tuto proměnnou do /etc/init.d/servicename
, nemůže najít tuto proměnnou. Když spustím service servicename status
použitím /etc/init.d/servicename
soubor s následujícím obsahem:
case "$1" in
status)
cd $VAR/dir
;;
esac
říká /dir: No such file or directory
Ale funguje to, když spustím /etc/init.d/servicename status
namísto service servicename status
Jak mohu přimět unixovou službu, aby viděla proměnné prostředí?
Problém je, že service
odstraní všechny proměnné prostředí, ale TERM
, PATH
a LANG
což je dobrá věc. Pokud provádíte skript přímo, nic neodstraňuje proměnné prostředí, takže všechno funguje.
Nechcete se spoléhat na proměnné vnějšího prostředí, protože při spuštění proměnná prostředí pravděpodobně neexistuje a váš init systém ji pravděpodobně stejně nenastaví.
Pokud se přesto chcete na takové proměnné spolehnout, vytvořte soubor a přečtěte si z něj proměnné, např. vytvořit /etc/default/servicename
s obsahem:
VAR=value
a zdroj z vašeho init skriptu, např .:
[ -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
V mém případě jsem potřeboval Rails_ENV
, Který byl nastaven v /etc/bash.bashrc
: export Rails_ENV=staging
. Přidal jsem $(grep Rails_ENV /etc/bash.bashrc)
a to proměnnou zpřístupnilo skript. Udělal jsem to tímto způsobem, takže jsem nemusel zahrnovat zbytek souboru.