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

8

Eu tenho este serviço runit com rune log/runroteiros funcionando corretamente.

Por acaso, o próprio serviço pode falhar por motivos externos e pode não conseguir iniciar 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 checkscript e fazer alguma mágica lá, mas parece muito mais complicado do que deveria ser. Existe uma maneira melhor e mais simples?

jpbochi
fonte

Respostas:

3

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

Estenda o script inicial de serviço existente ou, se for complicado, insira um novo script inicial na cadeia (que, por sua vez, inicia o script inicial original). Em vez de iniciar o serviço imediatamente, o novo script de inicialização deve verificar se a última inicialização ocorreu recentemente. 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 tem idade suficiente. Se não tiver idade suficiente, deve esperar (inatividade) em um loop até que o arquivo fique velho o suficiente.

Algo assim pode funcionar (aguarda 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...
Laszlo Valko
fonte
Essa é uma boa abordagem. Assim que testá-lo, testarei o script com as possíveis correções necessárias.
Jspbochi
8

Você deve limitar a taxa de reinicialização no ./finisharquivo desse serviço, que é executado após o término anormal. O ./finishscript receberá o código de retorno de ./rune para lá, você pode determinar o que fazer, etc. Nesse caso, você deve ter seu ./finishscript gritando alto sobre as falhas, enviando notificações e pulando em chamas ...

Avery Payne
fonte
Obrigado, esta é a resposta certa, mas infelizmente os programadores modernos que usam python, ruby ​​etc. parecem sempre escrever aplicativos que não prestam atenção aos sinais unix e não fornecem códigos de saída adequados.
Figtrap 01/03/19
1
Os códigos de erro retornados aparentemente são "não legais", eu acho?
Avery Payne
parece que sim. Eu acho que é um grande passo para trás, eu mesmo.
figtrap
1

Eu realmente não sou um fã de gerenciamento de processos baseado em init (e runit é basicamente um substituto para init). Como você está descobrindo, a reinicialização simples de processos com falha assim que eles morrem não é uma estratégia particularmente boa. Eu usei o init para reiniciar o monit, mas isso é o mais longe possível. (potencialmente assassino OOM poderia matar monit).

Por isso, incentivo você a procurar uma substituição em vez de consertar as coisas.

Monit é bem velha, mas faz bem o trabalho, e não estou ciente de que algo melhor tenha surgido. Ele tem o bom recurso de não precisar armazenar mais memória após a inicialização, o que supera qualquer coisa escrita em uma linguagem de script. A última coisa que você deseja é que seu monitor de processo morra porque não consegue obter memória.

mc0e
fonte
O systemd, incluído no EL7 e na maioria das outras distribuições, pode lidar nativamente com essa situação e com uma variedade de situações semelhantes, com um grande número de opções e, principalmente, tornar obsoletos os gerentes de processo como esses.
Michael Hampton
1
Existem algumas situações em que o systemd pode ser "muito grande" para o ambiente de destino. E o método antigo de "gerenciamento de processos reiniciando até a execução" foi substituído principalmente pela resolução de dependência adequada. Veja skarnet.org/software/s6-rc e jjacky.com/anopa para obter exemplos.
Avery Payne