
Estou trabalhando em um dispositivo embarcado que executa Yocto Poky como distro.
O produto final terá vários aplicativos iniciados por SysVinit
. Existe apenas um root
usuário.
Tenho alguns scripts, tanto em /etc/init.d
e /etc/profile.d
que adicionam algumas variáveis de ambiente necessárias para nossas aplicações. O problema que estou enfrentando é que, se eu executar o aplicativo "manualmente" (portanto, tenho um shell interativo), eles funcionarão bem, já que os scripts /etc/profile.d/
foram originados, mas quando executados por SysVinit
, eles não conseguirão encontrar o ambiente preenchido (obviamente ). Estamos usando sh
como shell.
Eu li sobre diferentes arquivos como .bashrc
e .profile
algumas variáveis como ENV
e BASH_ENV
. Tentei definir minhas variáveis ali, mas sem sorte. Uma pequena solução que encontrei foi iniciar meu aplicativo principal em um shell de login (de SysVinit
):
2:12345:once:/bin/sh -lc /usr/bin/my_app
Então minhas perguntas são:
- Como posso definir o ambiente durante a inicialização (também conhecido como sem login) ou deixar
SysVinit
fazer isso de uma maneira legal? - As exportações realizadas em
/etc/init.d
scripts não se propagam de forma alguma para o meu ambiente; isso ocorre porque esses scripts são executados em um subshell e não originados no atual (isso exigirá login dois). Eu acho, então como posso exportar variáveis de lá? - Minha solução alternativa é uma solução válida?
Responder1
- Como posso definir o ambiente durante a inicialização (também conhecido como sem login) ou deixar o SysVinit fazer isso de uma maneira legal?
Durante a inicialização o ambiente está limpo (não é o jet inicializado). Você precisa colocar variáveis env via comandos source
ou (se o seu serviço for um script) ou inicializá-lo no programa (ou seja, via arquivo de configuração)..
sh
Pequeno exemplo de cabeçalho de script de serviço:
#!/bin/bash
[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh
. . .
- As exportações realizadas em scripts /etc/init.d não se propagam para o meu ambiente, isso porque esses scripts são executados em um subshell e não originados no atual (que exigirá login dois), eu acho, então como posso Exporto variáveis de lá?
source
suas variáveis env para subshells ou comandos de chamada com a variável env especificada.
Pequeno exemplo de cabeçalho de script de serviço:
#!/bin/bash
. . .
$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)
. . .
- Minha solução alternativa é uma solução válida?
Se for trabalho, é um caminho sujo para o serviço. Veja 1. e 2.