2009-10-04 3 views
0

Je suis en train de développer un script qui surveille un service en cas d'échec et lance une action différente en fonction de l'existence ou non d'une défaillance.service de surveillance pour "échec"

J'ai besoin d'un script python pour surveiller la sortie d'un programme python "monitor-services" et analyser la sortie de recherche pour une occurrence du mot "failure". S'il est présent, le script doit renvoyer une valeur true et s'exécuter pendant un maximum de 30 secondes renvoyant false si aucune occurrence de "failure" ne se produit.

sortie de l'échantillon retourné de "moniteur-services":

 
{Device} [/device/xxx] Networks = dbus.Array([dbus.ObjectPath('/device/xxx/xxx'), dbus.ObjectPath('/device/00242b2e41b6/hidden')], signature=dbus.Signature('o'), variant_level=1) 
{Service} [/profile/default/wifi_xxx_managed_wep] State = association 
{Profile} [/profile/default] Services = dbus.Array([dbus.ObjectPath('/profile/default/wifi_xxx_managed_wep'), dbus.ObjectPath('/profile/default/wifi_xxx_managed_rsn')], signature=dbus.Signature('o'), variant_level=1) 
{Manager} [/] Services = dbus.Array([dbus.ObjectPath('/profile/default/wifi_xxx_managed_wep'), dbus.ObjectPath('/profile/default/wifi_xxx_managed_rsn')], signature=dbus.Signature('o'), variant_level=1) 
{Service} [/profile/default/wifi_xxx_managed_wep] **failure** 
{Service} [/profile/default/wifi_xxx_managed_wep] State = idle 

Toute aide serait appréciée. [Edit] Une erreur est susceptible de se produire avec 30 secondes environ de l'action déclenchant le script, par conséquent le script doit se terminer au bout de 30 secondes. [/ Edit]

+0

Cela semble une chose très simple (au moins en Perl, il suffit d'utiliser la fonction "grep"). Pourquoi utilisez-vous Python? Pouvez-vous utiliser un langage que vous connaissez mieux ou qui présente des fonctionnalités simples (par exemple, Perl)? – DVK

+0

Cela pourrait être un travail pour supervord. Ou pas. Mais reste. http://supervisord.org/ –

Répondre

1
#!/usr/bin/python 
from subprocess import Popen, PIPE 
import sys 

data = Popen(["monitor-services"], stdout=PIPE).communicate()[0] 

sys.exit("failure" in data) 

Cela fait tout ce que vous voulez, sauf pour les années 30 attendre (que je ne comprends pas). Notez qu'il renvoie 0 si l'échec est introuvable, 1 s'il est trouvé, conformément aux conventions de l'interpréteur (c.-à-d. Que 0 est un succès, un non-zéro est un échec).

+0

Oui, ça fonctionne. Merci pour votre réponse! Re: limite 30s - une erreur ne se produira que dans les 30 premières secondes après l'initialisation du script. Cependant, les threads et les minuteurs peuvent facilement résoudre ce problème. –

Questions connexes