Variável de ambiente não sendo escolhida pelo aplicativo quando iniciada com o Upstart (Ubuntu)

7

Como é possível obter uma nova variável de ambiente capturada pelo sistema sem reiniciar o servidor?

Como é um servidor Ubuntu 11.x, estou usando o Upstart para iniciar / reiniciar processos.

Eu adicionei uma nova variável de ambiente ao / etc / environment que precisa ser escolhida por um dos processos do meu aplicativo.

Se eu iniciar o processo diretamente do meu shell, a variável está sendo selecionada e está tudo bem (eu já obtive o / etc / environment para minha sessão). No entanto, quando eu inicio / reinicia o processo usando seu nome de serviço Upstart, a variável não está sendo vista.

 sudo start app-name

Tenho certeza de que, se eu reiniciei o servidor, a nova variável será atendida, mas gostaria de tentar evitar isso. Eu tenho alguns outros processos ao vivo rodando nele que eu gostaria de evitar interromper, se possível.

    
por Geuis 17.12.2011 / 11:59

3 respostas

3

Esta questão parece conter muitas sub-questões sobre como lidar com variáveis de ambiente em um script Upstart, então eu pensei em compartilhar algumas coisas que eu faço para lidar e testar meu ambiente para Upstart e Cron.

A primeira coisa a saber sobre o Upstart, e assim por diante, é que ele não compartilha o mesmo ambiente que o seu terminal ativo, então algo como:

$ export FOO=bar
$ start upstart-name

não funciona porque upstart-name não verá realmente o FOO que você acabou de exportar para o shell atual porque o Upstart é executado em um ambiente limpo.

Você pode imitar o ambiente limpo em que o Upstart (e o Cron) é executado com esse método prático que eu copiei de outra resposta há muitas luas:

# makes the current shell have an environment like cron or upstart
# http://stackoverflow.com/a/2546509/5006
function cronenv() {
  cron_env+="HOME=$HOME\n"
  cron_env+="LOGNAME=$LOGNAME\n"
  cron_env+="PATH=/usr/bin:/bin\n"
  cron_env+="SHELL=/bin/sh\n"
  cron_env+="PWD=$PWD\n"

  if [[ -n $LC_ALL ]]; then
    cron_env+="LC_ALL=$LC_ALL\n"
  fi

  env - 'echo -e $cron_env' /bin/sh
}

Apenas descarte isso em seu .bash_profile ou algo parecido e você poderá executar comandos quando o Upstart os executar:

$ cronenv
$ some/big/command --to --run --as --upstart

Agora, vamos configurar um ambiente compartilhado em nossa caixa, faremos isso colocando nossas variáveis de ambiente em /etc/profile.d/environ.sh

# /etc/profile.d/environ.sh
export FOO=bar

e, em seguida, obtendo isso em nosso script Upstart:

script
  # source our common environment file
  . /etc/profile.d/environ.sh
  exec some/big/command --to --run --as --upstart
end script

Agora poderemos "ver" nosso ambiente em qualquer shell e qualquer script Upstart que origine nosso arquivo comum (por padrão, o ssh no Ubuntu irá fornecer tudo de /etc/profile.d ). Yay!

    
por 30.05.2015 / 01:36
2

Coloque a sub-rotina env em seu arquivo de descrição de tarefa inicial.

link

env PIDFILE=/var/run/myprocess.pid

Ou qualquer coisa. Está tudo na documentação.

    
por 17.12.2011 / 12:02
1

Eu tive o mesmo problema. Meu script de inicialização funcionou bem a partir da linha de comando, mas não do script inicial.

Eu simplesmente tive que usar meu . /home/username/.bashrc no meu script upstart para trabalhar com todas as variáveis de ambiente corretas.

script

  cd /home/me
  . /home/me/.bashrc

  ~/www/app/bin/server.production
end script
    
por 02.11.2014 / 08:28