Domanda

Ho un sito Web scritto in PHP (CakePHP) in cui alcune attività ad alta intensità di risorse sono gestite da un processo in background. Questo viene fatto attraverso la coda dei messaggi di Beanstalkd. Ho bisogno di un modo per recuperare lo stato di quel processo in background in modo da poterlo monitorare con Monit.

Il processo in background è una shell CakePHP (solo uno script CLI PHP) che comunica con Beanstalkd. Fa semplicemente una riserva () su Benastalkd e aspetta un nuovo messaggio. Quando riceve un messaggio, lo elabora. Voglio un modo per monitorare questo processo con Monit in modo che possa riavviare il processo in background se qualcosa è andato storto .

Quello a cui ho pensato finora è scrivere uno script CLI PHP che rilascia un messaggio in Beanstalkd. Il processo in background raccoglie il messaggio e in qualche modo comunica lo stato interno allo script della CLI. Ma come? Prese? Memoria condivisa? Qualche altro metodo IPC?

O forse sono troppo complicato qui e c'è un modo molto più semplice per monitorare un simile processo con Monit?

Grazie in anticipo!

È stato utile?

Soluzione

Ecco cosa ho fatto alla fine.

Lo script CLI si collega a beanstalkd, crea una nuova coda (tube) e inizia a guardarlo. Quindi rilascia un messaggio di massima priorità nella coda che il demone in background sta guardando. Tale messaggio contiene il nome della nuova coda monitorata dallo script CLI.

Il processo in background riceve questo messaggio quasi immediatamente (poiché ha la massima priorità), genera un messaggio di stato e lo inserisce nella coda che lo script CLI sta guardando. Lo script CLI lo riceve e quindi chiude la coda.

Quando lo script CLI non riceve risposta entro 30 secondi, si chiuderà con un errore che indica che il demone in background è (molto probabilmente) bloccato.

Ho legato tutto questo a Monit. Ora Monit può verificare che il daemon in background sia in esecuzione (tramite il file pid e l'elenco dei processi) e verificare che stia ancora elaborando i messaggi (utilizzando lo strumento CLI per verificare che risponda alle richieste di stato)

Altri suggerimenti

Probabilmente c'è un plugin per Monit o Nagios per connettersi, eseguire le statistiche e tornare se ce ne sono "troppi". Non esiste un "protocollo" già scritto per questo, ma sembra che t non sia estremamente difficile modificare uno esistente basato su testo (come nntp o smtp) per fare ciò che si desidera. Significa però scriverlo in C, a quanto pare.

Da uno script CLI-PHP, lo farei attraverso uno (o entrambi) di due metodi diversi.

1 / rilascia un messaggio con priorità (basso) nella coda e assicurati che ritorni entro pochi secondi. Metterlo in una coda dedicata e assicurarsi che non ci sia nulla prima di inserirlo, sarebbe una buona aggiunta. 2 / esegui un 'stats' e vedi quanti sono in attesa: 'current-jobs-ready'.

Per riportare le informazioni su un sito Web (in entrambi i casi), puoi scrivere su un file o in qualcosa come Memcached su cui gts legge e agisce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top