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

16

Estou tentando iniciar um programa (Resque), mas demora um pouco até que um pidfile seja escrito. Assim, acho que a Monit acha que o programa não começou e inicia mais um ou dois programas antes do antes do pidfile do primeiro ser escrito.

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

    
por Ramon Tayag 27.05.2012 / 04:56

5 respostas

10

Como faço para atrasar 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 da Monit diz

Services are checked in regular intervals given by the

set daemon n

statement. Checks are performed in the same order as they are written in the .monitrc file, except if dependencies are setup between services, in which case the services hierarchy may alternate the order of the checks.

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

  1. intervalo personalizado com base no tamanho do ciclo de pesquisa múltiplo

CADA [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 tarefas de resque com monit porque monit é um daemon muito leve, mas acabou se estabelecendo com GOD. Eu sei, eu sei que Deus tem mais fome de recursos em comparação com o monit mas em caso de resque achamos que é um bom jogo.

    
por 27.05.2012 / 05:27
19

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

Consulte SERVICE POLL TIME na documentação do 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ê está experimentando uma inicialização lenta, você pode estender o tempo limite no comando start do serviço:

check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds
    
por 27.05.2012 / 05:27
6

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 em 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 )

    
por 01.07.2014 / 18:02
2

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

Isso evita esperar muito tempo entre as verificações, o que combinado ao início lento é um impacto muito maior para os clientes. Ele funciona usando um script intermediário que age como sinalizador para indicar que o monitor já está realizando ações da ú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 web de inicialização lenta) estiver inativo por 3 minutos seguidos, reinicie, MAS somente se um script de reinicialização ainda não estiver em execução.

O script que é chamado tem um sono especificado que espera mais tempo do que o tempo de início mais lento para o serviço (no nosso caso, esperamos terminar em ~ 10, então 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"
    
por 21.03.2015 / 22:12
1

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)]

O estado docs :

In the case of a process check, Monit will wait up to 30 seconds for the start/stop action to finish before giving up and report an error. You can override this timeout using the TIMEOUT option.

Qual é o valor do "tempo limite".

    
por 19.02.2016 / 18:59

Tags