Faça o monit esperar mais tempo antes de pensar que algo está morto


20

Estou tentando iniciar um programa (Resque), mas leva um pouco de tempo até que um pidfile seja gravado. Portanto, acho que o Monit acha que o programa não foi iniciado e inicia mais um ou dois programas antes que o pidfile do primeiro seja gravado.

Como adiar o tempo que o Monit verifica novamente, apenas para este processo? Ou devo resolver isso de outra maneira?


Eu adicionei uma nova resposta abaixo. Embora esperar mais tempo entre as verificações impeça colisões por serviços lentos, pode ser uma experiência muito ruim para os clientes.
Eddie

Respostas:


10

Como adiar o tempo que o Monit verifica novamente, apenas para este processo?


O que você está tentando alcançar pode ser feito através do recurso " SERVICE POLL TIME " do monit

A documentação do Monit diz

Os serviços são verificados em intervalos regulares fornecidos pelo

set daemon n

declaração. As verificações são executadas na mesma ordem em que são gravadas no arquivo .monitrc, exceto se as dependências estiverem configuradas entre os serviços; nesse caso, a hierarquia de serviços pode alternar a ordem das verificações.

Um dos métodos para personalizar a pesquisa de serviço é

  1. intervalo personalizado com base na duração do ciclo de pesquisa

TODOS [número] CICLOS

Exemplo:

check process resque with pidfile /your/app/root/tmp/pid/resque.pid
   every 2 cycles

Ou devo resolver isso de outra maneira?


Eu também fiz uma tentativa inicial de monitorar trabalhos de resque com o monit porque o monit é um daemon muito leve, mas eventualmente resolvido com o DEUS. Eu sei, eu sei que DEUS tem mais recursos em comparação com o monit, mas em caso de resque achamos que é uma boa combinação.


Obrigado! Acabei usando todos os ciclos x. Acabei de encontrar o número que funcionou para mim.
Ramon Tayag 27/05

19

Você pode verificar um serviço específico em um intervalo diferente do padrão ...

Consulte SERVICE POLL TIME na documentação da Monit.

Um exemplo para o seu programa Resque seria verificar um número diferente de ciclos:

check process resque with pidfile /var/run/resque.pid
   every 5 cycles

ou da seção de exemplos:

Some servers are slow starters, like for example Java based Application Servers. 
So if we want to keep the poll-cycle low (i.e. < 60 seconds) but allow some services to take its time to start, 
the every statement is handy:

 check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
       start program = "/etc/init.d/dynamo start"
       stop program  = "/etc/init.d/dynamo stop"
       if failed port 8840 then alert

ou você pode aproveitar as verificações no estilo cron.

check process resque with pidfile /var/run/resque.pid
   every 10 * * * *

ou se você estiver tendo uma inicialização lenta, poderá estender o tempo limite no comando service start:

check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds

Mesma resposta, certo?
Ewwhite 27/05

2
with timeout 90 secondsera exatamente o que eu queria. Obrigado.
28515

1
Parabéns por incluir tempos limite e estilo cron. Esta é a resposta mais precisa e completa.
RCross

9

Você também pode verificar se algo falhou por X vezes seguidas:

 if failed 
    port 80 
    for 10 cycles 
 then alert

Ou por X vezes nas pesquisas Y:

 if failed 
    port 80
    for 3 times within 5 cycles 
 then alert

Ou ambos:

 check filesystem rootfs with path /dev/hda1
  if space usage > 80% for 5 times within 15 cycles then alert
  if space usage > 90% for 5 cycles then exec '/try/to/free/the/space'

( daqui )


1
Essa é outra resposta muito boa, pois mostra como você pode verificar o intervalo padrão, mas apenas tomar medidas com mais clareza.
precisa saber é o seguinte

2

Um membro da minha equipe encontrou uma solução bastante inteligente que permite que o monit verifique com freqüência (a cada minuto) , mas depois de tentar reiniciar o serviço (que leva aproximadamente 10 minutos), ele aguardará um período de carência especificado antes de tentar iniciar novamente.

Isso evita esperar muito tempo entre as verificações, o que combinado com o início lento é um impacto muito maior para os clientes. Ele funciona usando um script intermediário que atua como sinalizador para indicar que o monit já está agindo desde a última falha.

check host bamboo with address bamboo.mysite.com
   if failed
           port 443 type tcpSSL protocol http
           and status = 200
           and request /about.action
            for 3 cycles
   then exec "/bin/bash -c 'ps -ef | grep -v "$$" | grep -v "grep" | grep restartBamboo.sh >/dev/null 2>&1; if [ $? -ne 0 ]; then /opt/monit/scripts/restartBamboo.sh; fi'"

Se o bambu (aplicativo da web de inicialização lenta) ficar inativo por 3 minutos seguidos, reinicie, MAS apenas se um script de reinicialização ainda não estiver em execução.

O script chamado tem uma suspensão especificada que aguarda por mais tempo que a hora de início mais lenta do serviço (no nosso caso, esperamos terminar em ~ 10, portanto, dormimos por 15)

#!/bin/bash
echo "Retarting bambo by calling init.d"
/etc/init.d/bamboo stop
echo "Stopped completed, calling start"
/etc/init.d/bamboo start
echo "Done restarting bamboo, but it will run in background for sometime before available so, we are sleeping for 15 minutes"
sleep 900
echo "done sleeping"

2

A versão atual do Monit (5.16) suporta um tempo limite para os scripts de início com a sintaxe:

 <START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <number | string>]
    [[AS] GID <number | string>]
    [[WITH] TIMEOUT <number> SECOND(S)]

Os documentos afirmam:

No caso de uma verificação de processo, o Monit aguardará até 30 segundos para que a ação de iniciar / parar seja concluída antes de desistir e relatar um erro. Você pode substituir esse tempo limite usando a opção TIMEOUT.

Qual é o que o valor "timeout" fará.


Estender o tempo limite funciona se o início real demorar muito, mas na pergunta original parece que o programa pode ter iniciado rapidamente (ou seja, retornado), mas não gravou o PID imediatamente. Existe uma maneira de dizer ao monit para não verificar o serviço por um tempo especificado após a reinicialização?
PeterVermont 9/17/17

Isso timeoutdeve se aplicar a ambas as partidas e reinicializações. Tanto quanto eu entendo, isso atrasa antes que o Monit verifique que: a) está em execução, b) o arquivo PID esperado foi criado ec) um processo com o PID esperado está em execução no momento. Eu tive alguns problemas para fazê-lo funcionar onde o aplicativo especificado era apenas um script que bifurcava o processo real e depois retornava sem saber o que estava acontecendo com o processo. Fazê-lo funcionar nesse caso foi uma dor.
jeteon

e o sistema é reiniciado e inicia os serviços? existe alguma maneira de especificar um atraso inicial, em segundos, para cada verificação? também as verificações passivas sem instruções de início / parada
Massimo

Acredito que nesse caso você esteja procurando START DELAY.
jeteon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.