it-swarm-eu.dev

Jak zajistit, aby unixová služba viděla proměnné prostředí?

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

52
altern

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
70
Ulrich Dangel

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.

1
geermc4