Configurando variáveis de ambiente no Linux para todos os processos

4

Estou usando o Ubuntu 9.1 (Karmic Koala) no meu servidor.

Uma simples questão de configurar variáveis de ambiente para que elas estejam globalmente disponíveis em todos os processos está me enlouquecendo e eu gostaria de receber ajuda!

Eu tentei defini-los usando o comando de exportação em vários locais 'usuais suspeitos' diferentes, como .bashrc, .bashrc, .profile. Isso funciona muito bem para o shell em si e os processos bifurcados fora do shell, mas não para processos iniciados fora do shell (por exemplo, daemons iniciados no boot ou particularmente irritantes para mim é que o Mongrel lançado pelo Capistrano não parece ter essas variáveis definidas e, portanto, o Ruby não tem acesso a eles).

Eu também tentei algumas ideias malucas como configurá-las em um shell script e chamar este script durante o boot (via o método update-rc.d) sem sucesso.

No Windows, pode-se simplesmente definir uma "variável de sistema" que se torna disponível em todos os processos no sistema operacional. Como se faz isso no Linux? especificamente baseado em Debian?

    
por bhavinb 22.02.2010 / 16:07

3 respostas

7

Processos (incluindo shells) apenas herdam variáveis de seus pais. Não há como alterá-las do exterior depois disso.

Defina "variáveis globais" logo no início (para processos do sistema) ou invocação de shell (para processos do usuário), ou resignar-se a configurá-las em vários lugares.

Isso pode parecer uma dor, mas a capacidade de mudar outro ambiente de processos seria um erro e introduziria todos os tipos de condições desagradáveis de corrida.

O que você está tentando fazer com variáveis de ambiente "globais"? Pode haver uma maneira de contornar o problema.

Solução alternativa: Escreva um script mínimo no formato de shell favorito que somente define a variável desejada e coloque-o em um local acessível globalmente:

/etc/loglocaltion.sh :

export MY_LOG_DIR=/opt/share/mylog
export MY_DEFAULT_LOG_LEVEL=URGENT

e para tudo o que você deseja usar essa configuração, faça um

  1. inicie-o a partir do shell que possui source ed loglocation.sh em seu arquivo de login não interativo (aquele que é lido para todas instâncias do shell, ou seja, .bash_profile ).
  2. escreva um script de wrapper mínimo que origina loglocation.sh antes de iniciar o programa real. launchcorelogger.sh :

 CORELOGGER=/opt/sbin/mycorelogger
 source /etc/loglocation.sh
 exec $CORELOGGER

e tenha init executando o script.

Agora, as edições no script de loglocation afetarão todo o processamento associado se você executá-las de um shell novo no primeiro caso ou reiniciá-las usando o sistema dameon reiniciado ( /etc/init.d/mycorelogger restart ou qualquer outro).

    
por 22.02.2010 / 16:11
2

Eu proponho colocar seu env vars em / etc / environment. Mina contém atualmente

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
NUKE_PATH=/spr/studio/codebase/nuke

e NUKE_PATH são definidos para processos cron e shells Bash.

(Infelizmente, não para processos iniciados pelo Deadline, um aplicativo de enfileiramento de processos, mas esse problema não é seu :-)

    
por 18.12.2015 / 19:51
1

Este artigo me ajudou: link

Essencialmente, /etc/environment é bom para variáveis de todo o sistema e arquivos .sh em /etc/profile.d/ serão executados sempre que alguém fizer login via console ou por ssh.

    
por 27.09.2016 / 10:00