2015-03-05 11 views
7

ho creato monit app che deve riavviare golang site su incidentemmonit golang riavvio lento e lo stato non esiste

$ cd /etc/monit/conf.d 
$ vim checkSite 

Si programma a partire con nohup e salvare la sua pid su file:

check process site with pidfile /root/go/path/to/goSite/run.pid 
    start program = "/bin/bash -c 'cd /root/go/path/to/goSitePath; nohup ./goSite > /dev/null 2>&1 & echo $! > run.pid'" with timeout 5 seconds 
    stop program = "/bin/kill -9 `cat /root/go/path/to/goSitePath/run.pid`" 

Si parte ok.

Process 'site' 
    status       Running 
    monitoring status     Monitored 
    pid        29723 
    parent pid      1 
    uptime       2m 
    children       0 
    memory kilobytes     8592 
    memory kilobytes total   8592 
    memory percent     0.4% 
    memory percent total    0.4% 
    cpu percent      0.0% 
    cpu percent total     0.0% 
    data collected     Thu, 05 Mar 2015 07:20:32 

Poi per verificare come si riavvia il crollo ho ucciso manualmente golang site.

Qui ho due problemi:

  1. sito viene riavviato piuttosto lento: ci vogliono 1 minuti, anche se in configurazione ho impostato with timeout 5 seconds
  2. Stato di site in monit diventa Does not exist anche dopo sito in riavvio fatto. Immagino che ciò si verifichi perché dopo aver ucciso e riavviato il sito pid è cambiato in modo casuale, ma come non riuscire a superarlo.

stato dopo il riavvio:

Process 'site' 
     status       Does not exist 
     monitoring status     Monitored 
     data collected     Thu, 05 Mar 2015 08:04:44 

come ridurre il tempo di riavvio e di come riparare il sito di monit status?

monit registro:

[Mar 5 08:04:44] error : 'site' process is not running 
[Mar 5 08:04:44] info  : 'site' trying to restart 
[Mar 5 08:04:44] info  : 'site' start: /bin/bash 
[Mar 5 08:06:44] info  : 'site' process is running with pid 31479 

Aggiornamento

Il mio sito golang è piuttosto semplice:

package main 

import (
    "fmt" 
    "github.com/go-martini/martini" 
) 

func main() { 
    m := martini.Classic() 

    m.Get("/", func() { 
     fmt.Println("main page") 
    }) 

    m.Run() 
} 

Update 2

Ho cercato di aumentare la velocità di monit ricaricare il mio sito golang rimuovendo il file pid stesso. Dire che ho fatto kill 29723 && rm run.pid e acceso il timer per contare il tempo per il sito è stato nuovamente accessibile. Ci sono voluti 85 secondi. Quindi la rimozione del file pid non ha aiutato a monitorare per aumentare la velocità del sito di ricarica.

+0

Sarebbe di grande aiuto se mostrassi del codice. Per catturare segnali come sigint avrai bisogno di un po 'di codice, vedi http://stackoverflow.com/questions/11268943/golang-is-it-possible-to-capture-a-ctrlc-signal-and-run-a -cleanup-function-in – metakeule

+0

Si potrebbe anche provare a scrivere il PID tramite os.Getpid() dall'interno del programma go. – metakeule

+0

Provare a rimuovere il file PID dall'interno del programma go all'interno di un blocco di recupero differito e ad interrompere i segnali e scrivere un nuovo file PID se il processo (ri) inizia. – metakeule

risposta

4

monit non ha alcun meccanismo di sottoscrizione per scoprire rapidamente se un processo è morto.

In daemon mode, come documentato, monit funziona periodicamente interrogando lo stato di tutte le regole configurate, il suo ciclo di polling viene configurato all'avvio del daemon e le impostazioni predefinite in alcune distribuzioni Linux a 2 minuti, il che significa che in questo caso, monit può essere necessario fino a 2 minuti per eseguire qualsiasi azione.

Scegli questa configurazione nel proprio monitrc, è configurato con la direttiva set daemon, per esempio, se si desidera controllare lo stato ogni 5 secondi, allora si dovrebbe impostare:

set daemon 5 

Su ogni ciclo aggiorna la sua stato, ed esegue azioni se necessario a seconda di questo.Quindi, se rileva che il processo non esiste, riporterà lo Does not exist fino al successivo ciclo di polling, anche se è già necessario decodificare per riavviarlo.

Il nella direttiva start daemon non ha nulla a che fare con questo ciclo di polling, questo è il tempo che monit darà al servizio per l'avvio. Se il servizio non viene avviato in questo momento, monit lo segnalerà.

Se monit non soddisfa i requisiti, è anche possibile provare supervisord, che è sempre a conoscenza dello stato dei programmi eseguiti.

Problemi correlati