[TUTO] Une autre stratégie pour la surveillance des démons

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.
image
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 |) :

ps -eo ppid,stat,cmd | grep -e '^ 1 ’ | awk ‹ /teleinfo/ {print $2} ›

  • 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.


J’utilise cette approche depuis que le démon openzwave s’est arrêté sans que je m’en aperçoive.
Merci à tous, cordialement,

6 « J'aime »

Merci @phil38 :+1:

Super.
Merci bien

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…

1 « J'aime »

Bonjour,

J’aime bien ce tuto et pour info il y a aussi cette stratégie : [TUTO] Recevoir une notification Telegram regroupant les états des démons

Oui en effet, cette approche avec un scenario en php est très bien et même bien documentée. Y a plus qu’à :slight_smile:

1 « J'aime »

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 :slight_smile:

Elle se trouve où l’option Bash ?
Moi je n’ai que 2 possibilités d’ajouts de commandes : perso1 et perso2 et pas d’option Bash comme tu le montre.

Il faut utiliser le plugin Monitoring :
image
Tu spécifies comment tu veux monitorer (bash, snmp, etc.) ensuite pour chaque commandes tu spécifies le protocole ou le moteur.

cdt

1 « J'aime »

Il s’agit du plugin officiel Monitoring2 de jeedom :wink:
https://jeedom.github.io/plugin-monitoring2/fr_FR/

@phil38 + @kaktusatomik
Ok merci

Hello,
Suite aux problèmes du demon alexaAPI, j’ai souhaité suivre votre conseil. Je fais cette requête bash avec le plugin Monitoring2:

ps -eo ppid,stat,cmd | grep -e '^ 1 ’ | awk ‹ /Alexaapi/ {print $2} ›
OU
ps -eo ppid,stat,cmd | grep -e '^ 1 ’ | awk ‹ /Alexaapi// {print substr($2,1,1)} ›

Dans les 2 cas, le résultat de la commande est vide…

Est ce que j’ai oublié quelquechose? Pourriez vous m’aider?

Merci,

pignonson

1 « J'aime »

Il te manque les < > de chaque coté de < /Alexaapi/ {print $2} >

Hello Gerard
Ces commandes continuent à me renvoyer des réponses vides.

ps -eo ppid,stat,cmd | grep -e '^ 1 ’ | awk </Alexaapi/ {print $2}>
OU
ps -eo ppid,stat,cmd | grep -e '^ 1 ’ | awk </RFXcom/ {print substr($2,1,1)}>

Est ce qu’il y’aurai un tweakage particulier à faire sur Jeedom ou sur mon équipement du plugin monitoring?

Merci

Bonjour,
La commande awk accepte ses paramètres entre simple ou double quotes:
awk ‹ … › ou bien awk « … »
il n’y a pas de < ou de >

cdt

si tu utilise </> sur une nouvelle ligne tu peut insérer ton texte sans qu’il soit modifier

awk ' … ' ou bien awk " … "

Même chose pour moi, le retour de commande est vide.Voici ce que je saisie :

ps -eo ppid,stat,cmd | grep -e '^ 1 ’ | awk ‹ /deconz/ {print $2} ›

EDIT :
J’ai essayé les différentes écritures proposées mais même résultat.

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

cdt

Merci @phil38 pour ton aide.

Lorsque je saisis ps -eo ppid,stat,cmd, je retrouve bien deconz, blea et arlo

Lorsque je saisis ps -eo ppid,stat,cmd | grep -e ‹ ^ 1 › , je n’ai que cela qui s’affiche.

pi@raspberrypi:~ $ ps -eo ppid,stat,cmd | grep -e ‹ ^ 1 ›
1189 S /usr/bin/vncserverui -statusicon 5
1155 Z [sh]
1155 Sl lxterminal
1155 Sl leafpad

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

1 « J'aime »