Bonjour,
Je voulais partager avec vous une autre stratégie pour surveiller les démons essentiels. Les approches avec les plugin Watchdog ou Jeelink peuvent également convenir. Dans notre cas on s’appuie sur le plugin Monitoring avec la possibilité en bash d’utiliser une commande shell telle que ‹ ps › comme process status.
Un démon à la caractéristique d’être lancé à partir du process ‹ init › le processus père en quelque sorte, de ce fait un démon à généralement son ‹ parent process ID › est égal à 1. Ceci se vérifie avec les commandes shell ci-après (enchainées par des pipes |) :
On demande 3 informations à la commande ps : ppid, stat et cmd.
ppid : est l’ID du process père donc ppid=1 pour un démon
stat : est le statut du processus
cmd: est la commande qui a permis de lancer le processus
La commande grep permet de filtrer les lignes qui commence par 4 blancs puis un 1 et encore un blanc. Ce qui correspond à 1 dans la colonne ppid.
La commande awk cherche la ligne qui contient teleinfo (ici dans notre exemple) et imprime en sortie le statut (le deuxième mot de la ligne).
En utilisant le plugin Monitoring, avec l’option bash, il est donc facile de connaitre le statut d’un démon (ou d’un process) par son nom ou des éléments de son nom. Si un process n’existe pas, son statut est inconnu et la commande bash ne retourne rien/vide. Libre à chacun de décider des actions à mener dans ce cas : alerte, SMS, pushover, etc.
Merci @phil38 pour cet exemple ! C’est top !
De mon côté j’ai juste modifié le awk pour ne récupérer que la première lettre du process state : ... | awk '/teleinfo/ {print substr($2,1,1)}'
C’est en fonction de cette lettre que l’on peut determiner le statut :
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct (« zombie ») process, terminated but not reaped by its parent.
Les caractères suivants (s’il y en a) donnent d’autres informations… Du coup en ne se basant que sur le premier caractère, la création du widget est simplifié, surtout avec la v4…
Apres le principe de mon approche (scenar en php) est qu’il peut devenir dynamique avec quelques modifications de code… le jour où tu supprimes un daemon (en désinstallant un plugin par exemple) il se supprime tout seul dans les notifications.
des que je maitriserai un peu les designs, je ferai une version graphique de mon tuto
Il faut utiliser le plugin Monitoring :
Tu spécifies comment tu veux monitorer (bash, snmp, etc.) ensuite pour chaque commandes tu spécifies le protocole ou le moteur.
Pour bien débugger, il faut utiliser les 3 commandes individuellement depuis une session shell sur la cible:
tapez ps -eo ppid,stat,cmd et vérifiez que la ligne qui contient deconz apparait
tapez ps -eo ppid,stat,cmd | grep -e '^ 1' et vérifiez que la ligne qui contient deconz apparait. La difficulté ici est compter le nombre de blancs avant le 1 en chaque début de ligne. La commande grep sert à correctement filter les lignes.
enfin tapez les 3 commandes pour identifiez le statut de deconz
Ok c’est donc la commande grep et son filtre qui doit être ajustée.
Quand tu fais la commande ps... il faut trouver la ligne qui contient deconz (par exemple) et tu dois compter le nombre de blancs (d’espaces) depuis le début de ligne jusqu’au chiffre 1. Explication: chaque démon possède un PPID égal à 1. C’est cette manière que j’ai choisi pour filter les toutes les lignes de ps...
Ensuite tu ajuste la commande grep -e en gardant le signe ^ (qui signifie début de ligne), par exemple grep -e '^ 1 ' (4 blancs devant le 1). Attention: il y a toujours un blanc après le 1 (c’est-à-dire PPID est égal à 1 et non pas PPID contient un 1)
Bon courage