Como criar um serviço unix para ver variáveis de ambiente?

48

Eu configurei minha variável de ambiente usando /etc/profile :

export VAR=/home/userhome

Então, se eu fizer echo $VAR , ele mostrará /home/userhome

Mas quando coloco referência a essa variável no arquivo /etc/init.d/servicename , ela não consegue encontrar essa variável. Quando executo o arquivo service servicename status usando /etc/init.d/servicename com o seguinte conteúdo:

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

diz /dir: No such file or directory

Mas funciona se eu executar /etc/init.d/servicename status em vez de service servicename status

Como posso fazer um serviço unix ver variáveis de ambiente?

    
por altern 31.07.2012 / 10:46

3 respostas

66

O problema é que service retira todas as variáveis de ambiente, mas TERM , PATH e LANG , o que é bom. Se você estiver executando o script diretamente, nada removerá as variáveis de ambiente para que tudo funcione.

Você não quer depender de variáveis de ambiente externas, porque na inicialização a variável de ambiente provavelmente não está presente e seu sistema de inicialização provavelmente não irá configurá-lo de qualquer maneira.

Se você ainda quiser confiar em tais variáveis, crie um arquivo e leia as variáveis dele, por exemplo. crie /etc/default/servicename com o conteúdo:

VAR=value

e fonte de seu script de inicialização, por exemplo:

[ -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
    
por 31.07.2012 / 14:37
1

No meu caso, eu precisava de um RAILS_ENV definido em /etc/bash.bashrc : export RAILS_ENV=staging . Eu adicionei $(grep RAILS_ENV /etc/bash.bashrc) e isso disponibilizou a variável para o script. Eu fiz assim, então não precisei incluir o resto do arquivo.

    
por 19.06.2014 / 20:13
0

Uma solução feia que também funcionará:

function exec() {
    args=( $@ )
    command=${args[0]}
    dummy=${args[1]}
    whoami='whoami'
    if [ -z "$dummy" ]; then
        me='basename $0'
        runuser -l ${whoami} -c "bash /etc/init.d/${me} ${command} dummy"
    else
       printenv
   fi
}

case $1 in
    status)
        status
        ;;
    start|stop|kill|restart)
        exec $*
        ;;
    *)
        usage
esac
    
por 26.03.2015 / 16:35