Como pedir ao serviço systemd para recarregar suas variáveis de ambiente no tempo de execução

0

Pergunta

Meu aplicativo C ++ é executado como um serviço systemd. Eu preciso configurá-lo usando variáveis de ambiente e ser capaz de recarregar o valor das variáveis durante o tempo de execução sem reiniciar o aplicativo.

Eu criei um arquivo .conf e usei a diretiva Environment , e execute o daemon-reload após alterar o valor no .conf arquivo. Mas o serviço não percebe a alteração.

Eu sei sobre o comando systemctl reload , mas não sei o que definir na diretiva ExecReload .

código da aplicação C ++

#include <unistd.h>
#include <fstream>

using namespace std;

int main(int argc, char** argv)
{
    while (true)
    {
        char * cp = getenv("BAR");
        string s = "";
        if (cp)
            s = (string) cp;
        fstream fs;
        fs.open("/tmp/foo", ios_base::app);
        fs << s << endl;
        fs.close();
        sleep(1);
    }
    return 0;
}

Descrição do serviço

Caminho: /etc/systemd/system/foo.service

[Unit]
Description=Testing configuration reloading

[Service]
ExecStart=/home/user/foo_application
Type=simple

[Install]
WantedBy=default.target

Arquivo de configuração de serviço

Caminho: /etc/systemd/system/foo.service.d/foo.conf

[Service]
Environment="BAR=2"

Minha (re) pesquisa anterior

link

link

link

    
por ferranrigual 07.10.2016 / 10:27

2 respostas

1

O ambiente é copiado no espaço de endereço do processo quando o processo é criado. Mudanças no ambiente afetam apenas os processos recém-iniciados, você não pode alterar o ambiente de um programa em execução do lado de fora.

Você precisará de algum tipo de mecanismo de comunicação entre processos (IPC, interprocess communication) para o que você está tentando alcançar, ou simplesmente escrever um novo valor em um arquivo e fazer com que seu programa pesquise o conteúdo do arquivo.

    
por 07.10.2016 / 10:45
1

A menos que você esteja disposto a reiniciar o serviço em consideração (ou seja, encerrar o processo em execução e iniciar um novo), isso não funcionará. As variáveis de ambiente são um atributo individual de um processo, elas são herdadas do pai em inicialização (ou seja, quando o processo pai fork s). Não há como alterar variáveis de ambiente de processos em execução (não sobre hacks como manipular diretamente a memória do processo via /proc/pid/mem ). Assim, até mesmo acordar o processo por SIGUSR1 e tê-lo reler sua configuração (como muitos serviços e daemons são implementados para fazer) não ajudará - o processo encontraria as mesmas variáveis de ambiente de antes.

Para o comportamento que você pede, sugiro que considere obter parâmetros de configuração de um arquivo.

    
por 07.10.2016 / 10:46