În prima parte a acestei serii de tutorial în două părți, am văzut înființarea și controlul Supervizorului pentru a lucra cu aplicațiile noastre web. În această parte, vom vedea cum putem controla programatic procesele de supraveghere de la distanță prin API XML-RPC.
În partea anterioară, am văzut că Supervisor oferă o interfață grafică pe web care ne permite să controlam de la distanță procesele cu ajutorul a câteva clicuri. Mai jos este o captură de ecran a acestei interfețe grafice pentru aplicația creată în partea anterioară:
O întrebare începe imediat să sune în creier. Ce se întâmplă dacă ar fi posibil să se controleze procesele Supervizorului în mod programatic? Acest lucru ar deschide o mulțime de posibilități în care procesele pot fi pornite sau oprite în mod condiționat, mai degrabă decât să le rulați pe termen nelimitat sau să le controlați manual, făcând clic pe butoane sau comenzile terminale care rulează. Acest lucru este foarte posibil prin utilizarea API-ului XML-RPC furnizat de Supervisor.
API-ul în sine este destul de simplu și ușor de utilizat. Am văzut că serverul HTTP pentru Supervisor rulează în portul 9001 în mod implicit. Același lucru poate fi folosit pentru a vă conecta folosind orice bibliotecă XML-RPC. În cazul Python, putem folosi pur și simplu built-in-ul xmlrpclib
. Presupunând că serverul Supervizor funcționează pe http: // localhost: 9001 /:
>>> import xmlrpclib >>> server = xmlrpclib.Server ('http: // localhost: 9001 / RPC2')
Pentru a verifica starea actuală a serverului Supervisor, executați:
>>> server.supervisor.getState () 'statename': 'RUNNING', 'statecode': 1
Daemonul de server poate fi repornit și oprit prin:
>>> server.supervisor.restart () >>> server.supervisor.shutdown ()
În mod similar, lista tuturor metodelor disponibile poate fi preluată de:
>>> server.system.listMethods ()
Referința API furnizată în documentația Supervizor este destul de curată și explicită. Continuând în acest tutorial, voi prezenta un exemplu de control al proceselor bazate pe o condiție, precum și modul în care putem extinde acest API pentru a ne implementa propriile metode.
Să spunem că dorim să începem un nou proces pentru a trimite un e-mail de fiecare dată când o acțiune este efectuată de un anumit utilizator. (Există multe modalități de a face acest lucru și poate că nu este cel mai bun, dar îl folosesc doar ca exemplu pentru a demonstra acest lucru). Să spunem numele acestui proces așa cum este definit în supervisord.conf
este send_mail
.
dacă user.action_performed: server.supervisor.startProcess ('send_email')
În mod similar, putem declanșa și repornirea automată a supervisord
server daemon în cazul în care avem o modificare a codului în aplicația noastră.
dacă app.code_change (): server.supervisor.restart ()
Acest API poate fi aplicat în mod similar la nenumărate astfel de cazuri.
Nu putem folosi doar metodele standard API furnizate de Supervisor, ci și să ne scriem propriile metode, extinzând API-ul cu ajutorul fabricilor de interfață XML-RPC. Acest lucru se poate face simplu prin adăugarea unui nou [Rpcinterface: x]
secțiune în supervisord.conf
.
[rpcinterface: personalizat] supervisor.rpcinterface_factory = interfața mea: make_custom_rpcinterface
Acum voi crea o interfață personalizată mică pentru același lucru într-un fișier numit my_interface.py
.
din supervisor.rpcinterface import SupervisorNamespaceRPCIclassface clasa CustomRPCInterface: def __init __ (auto, supervisord): self.supervisord = supervisord self.retries = 3 def startProcessOrRetry (auto, nume, wait = True): interface = SupervisorNamespaceRPCInterface (self.supervisord) în timp ce nu interfața.startProcesați (nume) sau încercați din nou < self.retries: retry = retry + 1 # this is not used in code but referenced via an entry point in the conf file def make_custom_rpcinterface(supervisord): return CustomRPCInterface(supervisord)
Deasupra, am creat o metodă care, atunci când este chemată, va încerca din nou procesul de trei ori în cazul în care nu porni.
În această serie de tutori am învățat cum să folosim Supervisor pentru a monitoriza și controla aplicațiile noastre. De asemenea, am văzut cum putem utiliza interfața Web UI și XML-RPC pentru aceleași lucruri. În cele din urmă, interfața XML-RPC este extinsă pentru a mobiliza puterea Supervizorului în beneficiul nostru.