Como controlar a taxa de reinicializações automáticas de um serviço runit?

7

Eu tenho esse serviço runit com scripts run e log/run funcionando corretamente.

Ocorre que o serviço em si pode falhar por motivos externos e pode não ser iniciado por muitos minutos. A maneira padrão como o runit lida com essa situação é reiniciando o serviço a cada dois segundos. Como eu mudo esse comportamento?

Meu último insight foi adicionar um script check e fazer alguma mágica lá, mas parece muito mais complicado do que deveria ser. Existe uma maneira melhor e mais simples?

    
por jpbochi 26.09.2014 / 16:11

3 respostas

2

Eu não estou familiarizado com esse recurso, no entanto, se foi minha tarefa para resolver esse problema, e uma leitura de página de manual muito curta não ofereceu um botão simples para ajustar esse comportamento, eu faria o seguinte:

Estenda o script de início de serviço existente ou, se isso for complicado, insira um novo script de início na cadeia (que, por sua vez, inicia o script de início original). Em vez de iniciar o serviço imediatamente, o novo script de início deve verificar se a última inicialização ocorreu com tempo suficiente. Isso pode ser feito verificando um arquivo de sinalização criado pelo início anterior. Se o arquivo não existir, o script poderá continuar, tocar no arquivo e iniciar o serviço. Se o arquivo existir, o script deve verificar se o arquivo é antigo o suficiente. Se não tiver idade suficiente, ele deve aguardar (dormir) em um loop até que o arquivo tenha idade suficiente.

Algo como isso pode funcionar (espera pelo menos 1 minuto entre as reinicializações):

#!/bin/bash

SIGNALDIR=/tmp
SIGNALFILE=service.started

while /bin/true; do
        found='find "${SIGNALDIR}" -maxdepth 1 -name "${SIGNALFILE}" -mmin -1 | wc -l'
        [ "${found}" -eq 0 ] && break
        echo "Waiting"
        sleep 10
done

touch "${SIGNALDIR}/${SIGNALFILE}"
original service start...
    
por 04.10.2014 / 16:01
7

Você deve limitar sua taxa de reinicializações no arquivo ./finish desse serviço, que é executado após o encerramento anormal. O script ./finish receberá o código de retorno de ./run e você poderá determinar o que fazer, etc. Nesse caso, você deve ter seu script ./finish gritando em voz alta sobre as falhas e enviando notificações e pulando por aí em chamas ...

    
por 17.12.2014 / 02:05
1

Eu realmente não sou fã do gerenciamento de processos baseados em init (e runit é basicamente um substituto de init). Como você está descobrindo, o simples reinício de processos falhos assim que eles morrem não é uma estratégia particularmente boa. Eu usei o init para reiniciar o monit, mas isso é o máximo possível. (potencialmente matador da OOM poderia matar o monit).

Então, eu o encorajo a procurar um substituto em vez de consertar as coisas.

Monit é bem antiga, mas faz bem o trabalho, e eu não estou ciente de nada melhor que veio junto. Ele tem o bom recurso de não precisar armazenar mais memória após o start-up, então é melhor do que qualquer coisa escrita em uma linguagem de script. A última coisa que você quer é que seu monitor de processo esteja morrendo porque não pode ter memória.

    
por 04.10.2014 / 16:50