Preencher ambiente em sessão não interativa

Preencher ambiente em sessão não interativa

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 rootusuário.

Tenho alguns scripts, tanto em /etc/init.de /etc/profile.dque 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 shcomo shell.

Eu li sobre diferentes arquivos como .bashrce .profilealgumas variáveis ​​como ENVe 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:

  1. Como posso definir o ambiente durante a inicialização (também conhecido como sem login) ou deixar SysVinitfazer isso de uma maneira legal?
  2. As exportações realizadas em /etc/init.dscripts 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á?
  3. Minha solução alternativa é uma solução válida?

Responder1

  1. 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 sourceou (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

. . .
  1. 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á?

sourcesuas 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)

. . .
  1. Minha solução alternativa é uma solução válida?

Se for trabalho, é um caminho sujo para o serviço. Veja 1. e 2.

informação relacionada