De-daemonizing de um serviço existente

3

Eu tenho um serviço existente, que não posso modificar diretamente - digamos que é de código fechado ou complexo demais para editar ou atualizar automaticamente e, portanto, não é um bom alvo para modificações diretas.

Eu gostaria de executar isso de forma limpa em um contêiner do Docker, portanto, preciso de um único processo em primeiro plano que deve viver e morrer com o serviço, ou seja, iniciar o processo deve iniciar o serviço e quando o serviço for finalizado O processo raiz deve terminar também, para que o contêiner Docker termine.

Existe um bom padrão ou uma ferramenta existente para fazer isso? Idealmente, ele redirecionaria o stdout / stderr do serviço para seu próprio stdout / stderr.

O serviço tem um script de inicialização regular e é iniciado via /etc/init.d/myservice start .

O que tenho visto com bastante frequência é o contêiner iniciando o serviço e, em seguida, usando tail -n0 -F em algum arquivo de log principal. Isso funciona para dar ao contêiner algum tipo de stdout, mas se o serviço falhar, o contêiner ficará em silêncio, continuará em execução e nunca exibirá nada novamente. Deve haver uma maneira melhor, não?

Um exemplo para pensar sobre isso pode ser svnserve . Na verdade, ele tem a opção --daemon --foreground , que é oficialmente apenas para depuração, mas funciona. Mas e se isso não existisse?

    
por hheimbuerger 30.06.2016 / 00:52

1 resposta

2

Se o binário estiver vinculado dinamicamente, você poderá LD_PRELOAD fork wrapper que não faz nada, exceto definir um sinalizador na primeira vez em que é chamado, e em chamadas subsequentes vê o sinalizador e age normalmente.

Se o binário estiver vinculado estaticamente, você poderá ptrace até a primeira chamada fork , pular essa chamada e pare de traçar.

No Linux, você pode executar o daemon em um namespace PID dedicado que apenas executa um script de monitoramento como PID 1 no namespace e o daemon. Quando o daemon é encerrado, o PID 1 no namespace, ou seja, o script de monitoramento, recebe um SIGCLD.

    
por 01.07.2016 / 01:53

Tags