Estou usando o Monit para monitorar vários processos que precisam estar ativos e em execução como um grupo para que um site funcione corretamente. Para trazer ou derrubar o site, há uma ordem definida pela qual os processos devem ser iniciados ou interrompidos. As dependências são as seguintes. (Os nomes foram alterados para proteger os inocentes. Uso nomes mais descritivos na configuração real.)
O serviço site
depende de site.workerA
, site.workerB
e site-redis
.
Ambos os trabalhadores dependem de site-redis
.
O site é sempre iniciado ou interrompido através do Monit para evitar a possibilidade de condições de corrida, ou o Monit trabalhando contra mim. (por exemplo, eu paro um serviço e a Monit continua a reiniciá-lo.)
O problema é que leva muito mais tempo do que o necessário para colocar todo o site em funcionamento. Se eu instruir a Monit para iniciar o site, uma vez que a Monit tenha percebido as dependências, a sequência de ações da parte da Monit é:
site-redis
. site-redis
está em execução, portanto, inicie os dois trabalhadores. site
. site
está em execução.] Eu entrei os dois últimos passos porque eles são praticamente irrelevantes, já que o site está efetivamente funcionando antes do último intervalo de 2 minutos.
O intervalo de 2 minutos é o intervalo de pesquisa padrão que o Monit usa para verificar os serviços. Eu sei que eu poderia reduzir esse intervalo para que esses serviços sejam sempre pesquisados com mais freqüência. Por exemplo, eu poderia fazer
check process site.workerB pidfile "/srv/site/var/run/site/site.workerB.pid"
every [number] cycles
...
Eu também teria que mudar a duração do ciclo de polling para algo menor, de modo que um ciclo seja menor que 2 minutos.
No entanto, eu não quero que o Monit sempre pesquise esses serviços com mais freqüência. Eu gostaria que o Monit pesquisasse serviços apenas com mais frequência quando estivesse aguardando uma mudança de estado. Digamos que, se o Monit tiver iniciado um serviço e outro serviço depender dele, faça uma pesquisa em 5 segundo intervalo em vez de 2 minutos.
Eu não estou vendo nenhuma maneira de configurar o Monit para fazer isso, mas talvez eu tenha perdido alguma coisa.
Aqui está uma ilustração da minha descrição em prosa acima. Depois de remover coisas que não são pertinentes ao problema, a configuração do Monit é assim:
check process site-redis pidfile ".../site/redis.pid"
group site
start program = ...
stop program = ...
if does not exist then start
check process site pidfile ".../site/site.pid"
group site
depends on site.workerA, site.workerB, site-redis
start program = ...
stop program = ...
if does not exist then start
check process site.workerA pidfile ".../site/site.workerA.pid"
group site
depends on site-redis
start program = ...
stop program = ...
if does not exist then start
check process site.workerB pidfile ".../site/site.workerB.pid"
group site
depends on site-redis
start program = ...
stop program = ...
if does not exist then start
Tags monitoring monit