====== Monitoraggio processi con Monit ====== In generale un processo (demone) una volta lanciato deve funzionare, punto e basta. Può capitare però che per colpa di qualche bug non ancora risolto, il processo muoia e sia neccessario riavviarlo manualmente. E' il caso di Spamassassin 3.3.2 con Perl 5.14.2 su Debian Wheezy, ogni tanto il processo **''spamd''** muore senza motivo. Nei file di log si trova: spamd[4563]: prefork: adjust: 10 idle children more than 9 maximum idle children. Decreasing spamd children: 27150 killed. spamd[4563]: spamd: handled cleanup of child pid [27150] due to SIGCHLD: interrupted, signal 2 (0002) spamd[4563]: spamd: handled cleanup of child pid [27151] due to SIGCHLD: interrupted, signal 2 (0002) e poi niente altro (il processo ''spamd'' padre è morto). Potrebbe trattarsi di un bug, secondo i seguenti post: * https://bugzilla.redhat.com/show_bug.cgi?id=812359 * https://issues.apache.org/SpamAssassin/show_bug.cgi?id=6745 Come workaround al problema si installa **monit**, che semplicemente monitora la presenza del demone ''spamd'' e se necessario lo riavvia. ===== Configurazione di monit ===== Questo lo snippet di configurazione da salvare in **''/etc/monit/conf.d/spamd''**: check process spamd with pidfile /var/run/spamd.pid group spamd start program = "/etc/init.d/spamassassin start" stop program = "/etc/init.d/spamassassin stop" if 5 restarts within 5 cycles then timeout if cpu usage > 99% for 5 cycles then alert if mem usage > 99% for 5 cycles then alert depends on spamd_bin depends on spamd_rc check file spamd_bin with path /usr/sbin/spamd group spamd if failed checksum then unmonitor if failed permission 755 then unmonitor if failed uid root then unmonitor if failed gid root then unmonitor check file spamd_rc with path /etc/init.d/spamassassin group spamd if failed checksum then unmonitor if failed permission 755 then unmonitor if failed uid root then unmonitor if failed gid root then unmonitor **Attenzione:** Monit esegue un ciclo di test ogni due minuti (impostazione predefinita Debian, vedi **''set daemon 120''** in ''/etc/monit/monitrc''). Quando deve riavviare un servizio attende fino a 30 secondi per lo stop e lo start dello stesso, è possibile modificare tale tempo con l'opzione ''with timeout''. In base a questi parametri bisogna aggiustare il timeout (cioè quando scatta l'interruzione del monitoraggio) dopo un certo numero di restart avvenuti in un certo numero di cicli (''if 5 restarts within 5 cycles then timeout''). In caso contrario si ottiene ... [CET Mar 28 16:53:40] info : 'spamd' start: /etc/init.d/spamassassin [CET Mar 28 16:54:11] error : 'spamd' failed to start [CET Mar 28 16:56:11] error : 'spamd' process is not running [CET Mar 28 16:56:11] info : 'spamd' trying to restart [CET Mar 28 16:56:11] info : 'spamd' start: /etc/init.d/spamassassin [CET Mar 28 16:56:43] error : 'spamd' failed to start [CET Mar 28 16:58:43] error : 'spamd' service restarted 5 times within 5 cycles(s) - unmonitor Ecco quindi una configurazione che insiste più a lungo per riavviare il servizio e che esegue una azione drastica (**''killall -9''**) se il restart fallisce per 4 volte. Attenzione che il ''killall'' deve uccidere sia i processi chiamati **''spamd''** che i processi chiamati **''spamd child''**: ... start program = "/etc/init.d/spamassassin start" stop program = "/etc/init.d/spamassassin stop" with timeout 60 seconds if 4 restarts within 4 cycles then exec "/usr/bin/killall -9 --regexp 'spamd\b.*'" if 10 restarts within 10 cycles then timeout ... Poi alcuni parametri sono stati aggiustati in **''/etc/monit/monitrc''**: set daemon 120 # check services at 2-minute intervals with start delay 240 # optional: delay the first check by 4-minutes (by set mailserver localhost set mail-format { from: sistema@texnet.it } # Set custom From: mail header set alert support@texnet.it # receive all alerts set httpd port 2812 and use address 62.48.51.60 # only accept connection from localhost allow 62.48.51.60 # allow localhost to connect to the server and allow 62.48.51.8 # allow a remote host to connect to the server and allow admin:MySecret # require user 'admin' with password 'monit' allow @monit # allow users of group 'monit' to connect (rw) allow @users readonly # allow users of group 'users' to connect readonly ===== Interruzione del monitoraggio ===== Se un processo monitorato si blocca, viene tentato il suo riavvio. Potrebbe capitare che il processo non riesca a partire nei tempi previsti, ad esempio ''spamd'' che non ha rilasciato il socket: spamd[8042]: spamd: could not create INET socket on 127.0.0.1:783: Address already in use In tal caso il processo non viene più sottoposto a monitoraggio, neanche dopo un reboot. Si può verificare lo stato con: monit summary Per riattivare il monitoraggio: monit monitor spamd Questo comando funziona solo se è stata attivata la funzione integrata di server http (vedi configurazione ''set httpd'' sopra). Altrimenti come si fa ad attivare un monitoraggio disabilitato? FIXME