AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 413397
Accepted
lfagundes
lfagundes
Asked: 2012-08-02 11:43:04 +0800 CST2012-08-02 11:43:04 +0800 CST 2012-08-02 11:43:04 +0800 CST

Como definir a variável de ambiente no serviço systemd?

  • 772

Eu tenho um sistema Arch Linux com systemd e criei meu próprio serviço. O serviço de configuração em /etc/systemd/system/myservice.servicese parece com isso:

[Unit]
Description=My Daemon

[Service]
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

Agora eu quero ter uma variável de ambiente definida para o /bin/myforegroundcmd. Como faço isso?

systemd
  • 6 6 respostas
  • 507967 Views

6 respostas

  • Voted
  1. Best Answer
    Michael Hampton
    2012-08-02T12:07:49+08:002012-08-02T12:07:49+08:00

    Os tempos mudam e as melhores práticas também.

    A melhor maneira atual de fazer isso é executar systemctl edit myservice, que criará um arquivo de substituição para você ou permitirá que você edite um existente.

    Em instalações normais, isso criará um diretório /etc/systemd/system/myservice.service.de, dentro desse diretório, criará um arquivo cujo nome termina em .conf(normalmente, override.conf), e nesse arquivo você pode adicionar ou substituir qualquer parte da unidade enviada pela distribuição.

    Por exemplo, em um arquivo /etc/systemd/system/myservice.service.d/myenv.conf:

    [Service]
    Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
    Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"
    

    Observe também que se o diretório existir e estiver vazio, seu serviço será desabilitado! Se você não pretende colocar algo no diretório, verifique se ele não existe.


    Para referência, a maneira antiga era:

    A maneira recomendada de fazer isso é criar um arquivo /etc/sysconfig/myserviceque contenha suas variáveis ​​e carregá-las com a extensão EnvironmentFile.

    Para detalhes completos, veja a documentação do Fedora sobre como escrever um script systemd .

    • 414
  2. Michał Górny
    2014-04-23T23:48:47+08:002014-04-23T23:48:47+08:00

    A resposta depende se a variável deve ser constante (ou seja, não deve ser modificada pelo usuário que obtém a unidade) ou variável (deve ser definida pelo usuário).

    Como é sua unidade local, o limite é bastante embaçado e de qualquer maneira funcionaria. No entanto, se você começasse a distribuí-lo e acabasse em /usr/lib/systemd/system, isso se tornaria importante.

    Valor constante

    Se o valor não precisar ser alterado por instância, a maneira preferida seria colocá-lo como Environment=, diretamente no arquivo da unidade:

    [Unit]
    Description=My Daemon
    
    [Service]
    Environment="FOO=bar baz"
    ExecStart=/bin/myforegroundcmd
    
    [Install]
    WantedBy=multi-user.target
    

    A vantagem disso é que a variável é mantida em um único arquivo com a unidade. Portanto, o arquivo de unidade é mais fácil de mover entre os sistemas.

    Valor da variável

    No entanto, a solução acima não funciona bem quando o sysadmin deve alterar o valor da variável de ambiente localmente. Mais especificamente, o novo valor precisaria ser definido toda vez que o arquivo de unidade fosse atualizado.

    Para este caso, um arquivo extra deve ser usado. Como — geralmente depende da política de distribuição.

    Uma solução particularmente interessante é usar o /etc/systemd/system/myservice.service.ddiretório. Ao contrário de outras soluções, esse diretório é suportado pelo próprio systemd e, portanto, não possui caminhos específicos de distribuição.

    Neste caso, você coloca um arquivo assim /etc/systemd/system/myservice.service.d/local.confadiciona as partes que faltam do arquivo unit:

    [Service]
    Environment="FOO=bar baz"
    

    Depois, o systemd mescla os dois arquivos ao iniciar o serviço (lembre-se de systemctl daemon-reloadalterar um deles). E como esse caminho é usado diretamente pelo systemd, você não usa EnvironmentFile=para isso.

    Se o valor deve ser alterado apenas em alguns dos sistemas afetados, você pode combinar as duas soluções, fornecendo um padrão diretamente na unidade e uma substituição local no outro arquivo.

    • 115
  3. paluh
    2012-10-17T05:55:37+08:002012-10-17T05:55:37+08:00

    http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= - você tem duas opções (uma já apontada por Michael):

    Environment=
    

    e

    EnvironmentFile=
    
    • 54
  4. Don Kirkby
    2018-05-04T16:29:13+08:002018-05-04T16:29:13+08:00

    As respostas de Michael e Michał são úteis e respondem à pergunta original de como definir uma variável de ambiente para um serviço systemd. No entanto, um uso comum para variáveis ​​de ambiente é configurar dados confidenciais, como senhas, em um local que não seja confirmado acidentalmente no controle de origem com o código do seu aplicativo.

    Se é por isso que você quer passar uma variável de ambiente para o seu serviço, não use Environment=no arquivo de configuração da unidade. Use EnvironmentFile=e aponte para outro arquivo de configuração que seja legível apenas pela conta de serviço (e usuários com acesso root).

    Os detalhes do arquivo de configuração da unidade são visíveis para qualquer usuário com este comando:

    systemctl show my_service
    

    Eu coloquei um arquivo de configuração em /etc/my_service/my_service.confe coloquei meus segredos lá:

    MY_SECRET=correcthorsebatterystaple
    

    Então, no meu arquivo de unidade de serviço, usei EnvironmentFile=:

    [Unit]
    Description=my_service
    
    [Service]
    ExecStart=/usr/bin/python /path/to/my_service.py
    EnvironmentFile=/etc/my_service/my_service.conf
    User=myservice
    
    [Install]
    WantedBy=multi-user.target
    

    Verifiquei que ps auxenão consigo ver essas variáveis ​​de ambiente e outros usuários não têm acesso a arquivos /proc/*/environ. Verifique em seu próprio sistema, é claro.

    • 46
  5. user1830432
    2014-07-24T05:31:47+08:002014-07-24T05:31:47+08:00

    Michael deu uma solução limpa, mas eu queria obter a variável env atualizada do script. Infelizmente, a execução de comandos bash não é possível no arquivo de unidade systemd. Felizmente, você pode acionar o bash dentro do ExecStart:

    http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service&sect=5

    Observe que essa configuração não oferece suporte direto a linhas de comando do shell. Se as linhas de comando do shell forem usadas, elas precisam ser passadas explicitamente para uma implementação do shell de algum tipo.

    Exemplo no nosso caso é então:

    [Service]
    ExecStart=/bin/bash -c "ENV=`script`; /bin/myforegroundcmd"
    
    • 11
  6. Adrnalnrsh
    2022-09-10T09:25:27+08:002022-09-10T09:25:27+08:00

    Não use Environment= ou EnvironmentFile= para credenciais/segredos.

    Por https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Environment

    Você deveria usarLoadCredential=, LoadCredentialEncrypted= or SetCredentialEncrypted=

    Observe que as variáveis ​​de ambiente não são adequadas para passar segredos (como senhas, material de chave, …) para processos de serviço. As variáveis ​​de ambiente definidas para uma unidade são expostas a clientes sem privilégios via D-Bus IPC e geralmente não são entendidas como dados que requerem proteção. Além disso, as variáveis ​​de ambiente são propagadas pela árvore do processo, inclusive através dos limites de segurança (como executáveis ​​setuid/setgid) e, portanto, podem vazar para processos que não devem ter acesso aos dados secretos. Use LoadCredential=, LoadCredentialEncrypted= ou SetCredentialEncrypted= (veja abaixo) para passar dados para processos de unidade com segurança.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve