Eu configurei minha variável de ambiente usando /etc/profile
:
export VAR=/home/userhome
Então, se eu fizer echo $VAR
isso mostra/home/userhome
Mas quando coloco referência a essa variável no /etc/init.d/servicename
arquivo, ela não pode encontrar essa variável. Quando executo service servicename status
usando /etc/init.d/servicename
arquivo com o seguinte conteúdo:
case "$1" in
status)
cd $VAR/dir
;;
esac
diz /dir: No such file or directory
Mas funciona se eu correr em /etc/init.d/servicename status
vez deservice servicename status
Como posso fazer o serviço unix ver variáveis de ambiente?
rc
script System 5 diretamente também não funciona dessa maneira nos sistemas operacionais systemd, pois todas as invocações do script são transformadas em invocaçõessystemctl
por um gancho oculto.Respostas:
O problema é
service
tiras todas as variáveis de ambiente, masTERM
,PATH
eLANG
que é uma coisa boa. Se você estiver executando o script diretamente, nada removerá as variáveis de ambiente, para que tudo funcione.Você não deseja confiar em variáveis de ambiente externas, porque na inicialização a variável de ambiente provavelmente não está presente e seu sistema init provavelmente não a definirá de qualquer maneira.
Se você ainda deseja confiar nessas variáveis, obtenha um arquivo e leia as variáveis, por exemplo, crie
/etc/default/servicename
com o conteúdo:e origine-o do seu script init, por exemplo:
fonte
[ ... ]
é uma abreviação para um teste condicional; veja esta resposta .-f
é umif
argumento para verificar se o arquivo existe.&&
é um operador de curto-circuito: somente execute o segundo comando se o primeiro sair com 0..
operador de origem ou ponto: leia e execute comandos a partir do argumento filename.-z
é umif
argumento para verificar uma cadeia de comprimento zero.>&2
envia a saída para o stderr. Veja também Introdução ao if .-f
faz parte[
, nãoif
.[ ... ]
é uma abreviação de umtest
comando condicional ; veja esta resposta .-f
É umtest
argumento para verificar se existe um arquivo".[
(outest
) apenas como outro comando - tudo o queif
faz é executar alguma ação com base no status de saída.$VAR
estar no script init, preciso que ele esteja disponível para um programa diferente 2 ou 3 chamadas a jusante do script init. Por exemplo. O script init chama start-stop-daemon que chama o Programa 1 (Java) que chama o Programa 2 que precisa$VAR
. Eu tentei o truque nesta resposta, mas parece não funcionar na minha situação. Como posso garantir que$VAR
estará disponível para o Programa 2?No meu caso, eu precisava de um
RAILS_ENV
que foi 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. Fiz dessa maneira, para não precisar incluir o restante do arquivo.fonte
Uma solução feia que também funcionará:
fonte