Systemd reiniciar o serviço se não estiver ouvindo uma porta

4

Eu tenho usado o Systemd por um tempo no Debian 8. Eu uso a opção Restart = on-failure para despertar um serviço em caso de falha.

Eu gostaria de saber se existe uma maneira de forçar a reinicialização do serviço se ele não estiver ouvindo uma porta específica (mesmo que o processo ainda esteja em execução).

A razão pela qual eu preciso disso é porque estamos desenvolvendo o novo recurso para corrigir esse problema, mas vai demorar um pouco. Enquanto isso, precisamos de uma solução alternativa.

Desenvolvi um script para verificar esse status:

#! /bin/bash
PORTS=( 1452 542 )
for port in ${PORTS[@]}; do
    netstat -anp | grep $port > /dev/null 2>&1
    if [ "$?" -ne 0 ]; then
        # Port blocked. Kill the running process and start it again after a while
done

Este script é acionado periodicamente usando o cron. Eu sei que é um truque sujo. É por isso que gostaria de integrar esse comportamento na verificação do Systemd. Isso é possível?

Obrigado antecipadamente.

Felicidades,

A.

    
por Adrian Antunez 03.06.2016 / 15:54

1 resposta

5

Eu sugeriria que você o abordasse de maneira diferente e usasse uma ferramenta de monitoramento dedicada para realizar isso.

Minha ferramenta de monitoramento favorita, que permite que os serviços sejam reiniciados caso eles falhem, ou não estejam mais ouvindo em suas portas configuradas, é monit : link

Existem muitos exemplos no arquivo de configuração, neste site e em outros lugares, sobre como configurá-lo. Vou listar um exemplo para dar uma idéia de como é simples de usar, o exemplo usa o init.d no entanto, ele pode ser facilmente convertido para usar o systemd.

Para testar, um processo existe e está escutando em uma porta específica e para iniciá-lo quando este teste falhar:

check process example with pidfile /var/run/example.pid
start program = "/etc/init.d/example start"
start program = "/etc/init.d/example stop"
if failed host 192.0.2.10 port 80 protocol http then restart
if 5 restarts within 5 cycles then timeout

Você pode deixar de fora a parte do protocolo http e a monit fará apenas uma conexão tcp simples para testá-la. O argumento protocol faz um teste mais envolvido para verificar se algo está respondendo, por exemplo, a uma solicitação http get.

Você precisa garantir que o processo ou serviço seja iniciado de forma que um

arquivo pid correspondente seja criado em / var / run. A própria Monit não cuida disso. Normalmente, se o serviço for iniciado através de um script de inicialização ou systemd, ele deverá ter um arquivo pid em / var / run.

    
por 04.06.2016 / 03:30