Variáveis ​​de comando e ambiente de "serviço"

8

Estou tentando iniciar um serviço que requer um ambiente. variável a ser definida para determinado caminho. Defino essa variável em "/etc/profile.d/". No entanto, quando inicio este serviço usando o servicecomando, ele não funciona.

serviço de homem:

service runs a System V init script in as predictable environment as possible,
removing most environment variables and with current working directory set to /.

Então parece que serviceestá removendo minhas variáveis. Como devo configurar as variáveis ​​para impedir que elas sejam removidas. Ou isso é algo que não devo fazer.

Eu poderia iniciar o serviço manualmente usando os scripts init ou até mesmo codificar o caminho para o script, mas gostaria de saber como usá-lo com o servicecomando

Esa Varemo
fonte

Respostas:

4

A partir do Fedora 16, serviceapenas aceita LANGe TERMvariáveis ​​de ambiente, todo o resto é descartado. Portanto, mesmo que seu {CentOS, RHEL} atual aceite as variáveis ​​de alguma forma, esteja preparado para o futuro em que não funcione mais.

Portanto, a codificação do script init e / ou a configuração das variáveis ​​no próprio arquivo de configurações do daemon seriam suas escolhas.

Janne Pikkarainen
fonte
A desvantagem é que cada vez que eu atualizar o aplicativo eu tenho que mudar o arquivo, mas eu acho que eu só tenho que ... (... não atualizar frequentemente)
Esa Varemo
Bem, a "atualização frequente" é uma norma hoje em dia. Vive com isso.
Janne Pikkarainen
6

É recomendável colocar as definições de configuração em uma configuração na /etc/sysconfig/<servicename>qual é lida pelo script init.

Saudações

Bram

Bram
fonte
Como outra dica do /etc/sysconfig/<servicename>arquivo, você pode usar o bash's sourcepara carregar arquivos /etc/profile.de imitar o ambiente de login do shell.
Adam Gent
2

De man 5 init:

   Ambiente de trabalho
       Cada trabalho é executado com o ambiente a partir dos eventos ou comandos que o iniciaram. Além disso, você pode definir padrões no
       tarefa que pode ser substituída posteriormente e especifica quais variáveis ​​de ambiente são exportadas para os eventos gerados para a tarefa.

       A variável de ambiente especial UPSTART_EVENTS contém a lista de eventos que iniciaram o trabalho; ela não estará presente se o
       o trabalho foi iniciado manualmente.

       Além disso, os scripts de pré-parada e pós-parada são executados com o ambiente dos eventos ou comandos que interromperam o trabalho.
       A variável de ambiente UPSTART_STOP_EVENTS contém a lista de eventos que interromperam o trabalho, não estará presente se o trabalho
       foi parado manualmente.

       Todos os trabalhos também contêm as variáveis ​​de ambiente UPSTART_JOB e UPSTART_INSTANCE, contendo o nome do trabalho e da instância.
       Estes são usados ​​principalmente pelo utilitário initctl (8) como padrão para atuar no trabalho a partir do qual os comandos são chamados.

       env KEY [= VALUE]
              Define uma variável de ambiente padrão, cujo valor pode ser substituído pelo evento ou comando que inicia o trabalho.
              Se 'KEY = VALUE' for especificado, a variável KEY receberá o valor VALUE. Se apenas 'KEY' é dado, então o valor é obtido
              do próprio ambiente do daemon init (8).

       CHAVE DE EXPORTAÇÃO
              Exporta o valor de uma variável de ambiente para os eventos de início (7), início (7), parada (7) e parada (7) desse
              trabalho e a todos os eventos resultantes (não apenas aqueles relacionados ao trabalho atual).

Além disso, você pode fazer grep env /etc/init/*para ver como é usado

Esta é a minha saída:

/etc/init/container-detect.conf:env container
/etc/init/container-detect.conf:env LIBVIRT_LXC_UUID
/etc/init/container-detect.conf: # deve verificar se há "container" no ambiente do init.
/etc/init/container-detect.conf: [-d / proc / vz] && [! -d / proc / bc] && container = openvz
/etc/init/mounted-debugfs.conf:env MOUNTPOINT = / sys / kernel / debug
/etc/init/mounted-dev.conf:env MOUNTPOINT = / dev
/etc/init/mounted-proc.conf:env MOUNTPOINT = / proc
/etc/init/mounted-tmp.conf:env MOUNTPOINT = / tmp
/etc/init/munin-node.conf:env DAEMON = / usr / sbin / munin-node
/etc/init/mysql.conf:env HOME = / etc / mysql
/etc/init/nginx.conf:env DAEMON = / usr / local / nginx / sbin / nginx
/etc/init/nginx.conf:env PID = / usr / local / nginx / logs / nginx.pid
/etc/init/procps.conf:env UPSTART_EVENTS =
/etc/init/rc.conf:env INIT_VERBOSE
/etc/init/rc-sysinit.conf:env DEFAULT_RUNLEVEL = 2
/etc/init/rc-sysinit.conf:env RUNLEVEL =
/etc/init/rc-sysinit.conf:env PREVLEVEL =
/etc/init/rc-sysinit.conf:env INIT_VERBOSE
/etc/init/wait-for-state.conf:env TIMEOUT = 30
/etc/init/wait-for-state.conf:env MANUAL_OVERRIDE = "N"
/etc/init/wait-for-state.conf:env WAIT_FOREVER = "N"
/etc/init/wait-for-state.conf:env WAIT_STATE = "iniciado"
/etc/init/wait-for-state.conf:env TARGET_GOAL = "start"

E, para um exemplo exaustivo, veja alguns desses scripts. Aqui nginx.conf:

# nginx

descrição "nginx http daemon"
autor "Philipp Klose"

iniciar (sistema de arquivos e IFACE do dispositivo de rede = lo)
parar no nível de execução [! 2345]

env DAEMON = / usr / local / nginx / sbin / nginx
env PID = / usr / local / nginx / logs / nginx.pid

esperar garfo
reaparecimento
limite de reaparecimento 10 5
#oom nunca

script de pré-início
 $ DAEMON -t
 se [$? -ne 0]
 então saia de $?
 fi
script final

exec $ DAEMON
jperelli
fonte