Como assistir a um serviço com vários processos com o Monit?

4

Estou tentando assistir o gerenciador de listas de discussão com o monit. Uma instância sympa em execução consiste em vários processos para as diferentes tarefas do gerenciamento de listas (por exemplo, um processo separado para arquivar emails), mas todos os processos são iniciados / interrompidos com um único script de inicialização.

O ideal é que o monitor me avise se algum dos serviços falhar e, em seguida, reinicie o sympa, mas reinicie-o apenas uma vez. Uma primeira solução foi assim:

check process sympa
  with pidfile /var/run/sympa/sympa.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
check process sympa_bounced
  with pidfile /var/run/sympa/bounced.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"

No entanto, se eu parar o sympa manualmente, o script init será executado várias vezes, uma vez para cada serviço que eu definir (porque todo serviço falhou).

A minha segunda abordagem foi definir dependências e apenas alertar se algum dos subserviços falhar:

check process sympa
  with pidfile /var/run/sympa/sympa.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
  depends on sympa_bounced, sympa_bulk
check process sympa_bounced
  with pidfile /var/run/sympa/bounced.pid
  if does not exist then alert
check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  if does not exist then alert

Mas como os subserviços não são reiniciados, o serviço principal também não será reiniciado. Então eu percebi que eu poderia 'fingir' uma reinicialização definindo start / stop para /bin/true :

check process sympa
  with pidfile /var/run/sympa/sympa.pid
  start program = "/etc/init.d/sympa start"
  stop program = "/etc/init.d/sympa stop"
  depends on sympa_bounced, sympa_bulk
check process sympa_bounced
  with pidfile /var/run/sympa/bounced.pid
  start program = "/bin/true"
  stop program = "/bin/true"
check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  start program = "/bin/true"
  stop program = "/bin/true"

Isso também não funciona, porque se sympa_bulk falhar, o arquivo PID não será criado antes que o serviço sympa seja reiniciado, e isso não acontece antes que o sympa_bulk esteja rodando novamente.

Existe uma maneira de monitorar tal serviço, obter mensagens de alerta para todos os sub-serviços, mas reiniciar o serviço apenas uma vez, mesmo que todos os sub-serviços falhem ao mesmo tempo?

    
por morxa 26.01.2015 / 15:07

2 respostas

4

Existem duas soluções possíveis que encontrei. Ambos não são ideais, mas funcionam no meu cenário:

  1. Para cada subserviço, verifique apenas se o arquivo PID existe e suponha que o serviço esteja online, se o arquivo existir. Como antes, o serviço principal sympa depende dos subserviços:

    check process sympa
      with pidfile /var/run/sympa/sympa.pid
      start program = "/etc/init.d/sympa start"
      stop program = "/etc/init.d/sympa stop"
      depends on sympa_bounced, sympa_bulk
    
    check file sympa_bounced
      with path /var/run/sympa/bounced.pid
      if does not exist then restart
    
    check file sympa_bulk
      with path /var/run/sympa/bulk.pid
      if does not exist then restart
    

    restart não faz nada para arquivos, mas como sympa depende dos subserviços, ele será reiniciado.

  2. Com novas versões de monit, você também pode executar um comando e passar argumentos para o comando:

    check process sympa
      with pidfile /var/run/sympa/sympa.pid
      start program = "/etc/init.d/sympa start"
      stop program = "/etc/init.d/sympa stop"
      depends on sympa_bounced, sympa_bulk
    
    check program sympa_bounced
      with path "/usr/bin/pgrep --pidfile /var/run/sympa/bounced.pid"
      if does not exist then restart
    
    check program sympa_bulk
      with path "/usr/bin/pgrep --pidfile /var/run/sympa/bulk.pid"
      if does not exist then restart
    

    Semelhante a check file , a ação restart não faz nada pelos programas, mas força o serviço sympa a reiniciar.

    Com versões mais antigas (por exemplo, 5.4 , a versão atual no Debian Wheezy), você não pode passar argumentos para um comando, então você pode escrever um script simples (uma linha) para cada serviço que executa /usr/bin/pgrep com os respectivos argumentos.

Com ambas as soluções, sympa é reiniciado uma vez se qualquer um dos subservices falhar ou se sympa não estiver sendo executado.

    
por 28.01.2015 / 20:24
0

Você deve conseguir contorná-lo usando depends

Então, algo como

check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  depends on sympa
  start program = "/bin/true"
  stop program = "/bin/true"
    
por 26.01.2015 / 15:19