Freeze demon reboot jeedom

Hello,
J’ai depuis longtemps un problème de consistance du plugin DSC.
De temps en temps, ( la periodicité peut changer de 6 mois a un jour ) il freeze.
Dans le cas ou cela arrive, je n’ai plus aucun remontée d’infos et surtout il est impossible de relancer le Démon. Les logs restent eux aussi muet.

Seule solution relancer jeedom…

La carte envisalink n’a par contre aucun problème. l’interface eyezon continue de fonctionner normalement.

Comment puis je debugger efficacement ce problème? un endroit ou des log plus approfondies ? un log pour comprendre pourquoi le démon ne se relance pas ?

Merci d’avance

Personne pour au moins me donner la manip pour kill le demon ( qui ne veux même pas redémarrer ) ??

Salut

Il faudrait une copie de la page de configuration et les logs.

Antoine

Merci de ta reponse. quand tu dis page de configuration : celle du plugin ou de jeedom ?

Concernant le plugin DSC j’ai une erreur dans le log DSCnode, c’est d’ailleur la premiere fois, les fois d’avant, nombreuse, il ne disait rien.

0481|throw er; // Unhandled 'error' event
0482|^
0483|Error: listen EADDRINUSE: address already in use 0.0.0.0:4025
0484|at Server.setupListenHandle [as _listen2] (node:net:1751:16)
0485|at listenInCluster (node:net:1799:12)
0486|at doListen (node:net:1948:7)
0487|at process.processTicksAndRejections (node:internal/process/task_queues:83:21)
0488|Emitted 'error' event on Server instance at:
0489|at emitErrorNT (node:net:1778:8)
0490|at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
0491|code: 'EADDRINUSE',
0492|errno: -98,
0493|syscall: 'listen',
0494|address: '0.0.0.0',
0495|port: 4025
0496|}
0497|Node.js v18.17.1

C’est d’ailleur le dernier log car apres ca le demon DSC refuse de s’arrêter ou bien de redémarrer. Donc ce serait bien un problème sur NodeJS

Je continue les investigations et le topic tout seul :
EADDRINUSE semble être une erreur classique npm

En root , la commande

lsof -i : 4025 

pour voir qui utilise le port en question

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nodejs  31685 www-data   23u  IPv4 70865722      0t0  TCP jeedom.home:50114->envisalink.home:4025 (ESTABLISHED)
nodejs  31685 www-data   24u  IPv4 70877201      0t0  TCP *:4025 (LISTEN)

C’est donc le processus 31685 qui représente forcément le demon dsc qui est connecté dessus.

Je le Kill

kill -9 <PID>

je remplace le par celui affiché ( 31685 )

Dans jeedom , le démon apparaît maintenant désactivé. et je peux le lancer à nouveau.

Mes conclusions
Il semblerait qu’un autre processus vienne déranger aléatoirement le plugin DSC sur son nodeJS. NodeJs et son versionning sont d’ailleurs depuis pas mal de temps problématiques pour ce plugin.

Autre soucis, le processus de redémarrage du demon DSC n’est pas complet. et ne fonctionne pas correctement lorsque le process est planté

----EDIT DE FIN------
J’ai testé la fonction arret du Demon DSC et en fin de compte , c’est cette commande qui ne fonctionne pas. que le demon soit planté… ou non .

Après analyse du plugin dsc ( et je ne suis absolument : pas taper svp )
la fonction de reboot du service se trouve ici dans /plugins/dsc/core/class/dsc.class.php

public static function deamon_stop() {
    exec('kill  $(ps aux | grep "/jeedomdsc.js" | awk \'{print $2}\')');
    log::add('dsc', 'info', 'Arrêt du service dsc');
    $deamon_info = self::deamon_info();
    if (count($deamon_info['launched']) != 0) {
      sleep(1);
      exec('kill -9 $(ps aux | grep "/jeedomdsc.js" | awk \'{print $2}\')');
    }
    $deamon_info = self::deamon_info();
    if (count($deamon_info['launched']) != 0) {
      sleep(1);
      exec('sudo kill -9 $(ps aux | grep "/jeedomdsc.js" | awk \'{print $2}\')');
    }
  }

Il semblerai que j’ai trouvé le probleme.
Le demon DSC refuse de se kill / relancer dans un cas precis.

Lorsque je fais

 ps aux | grep "/jeedomdsc.js"

Dans certain cas 2 processus sont listés

root      6261  0.0  0.0   6204   820 pts/0    S+   14:50   0:00 grep /jeedomdsc.js
www-data 29286  0.2  0.6 609244 54840 ?        SNl  14:43   0:00 nodejs /var/www/html/plugins/dsc/resources/jeedomdsc.js http://192.168.1.9/plugins/dsc/core/api/dsc.php?apikey=********APIKEY******** user 192.168.1.15 4025 56 2

Hors, seul le deuxième service , ici PID 29286 correspond au demon DSC
Lors que le premier est present et en premiere position, ( ici 6261 ) alors il est impossible de kill le bon démon via la fonction jeedom.
est ce que cela semble plausible ?

Tu m’as perdu au moment du kill. Tu maitrises mieux que moi :smiley:

OH detrompe toi, c’est un peu comme CHATGPT, il suffit de le dire avec un ton sûr et tu as l’impression que le mec s’y connait :wink:

Bon s’il y a un Dev bien chevronné dans le coin… genre @Mips !

Salut,

Oui c’est sur que tenter de trouver un id de process via un grep, c’est le serpent qui se mange la queue si on fait pas gaffe, la première ligne correspond à la commande qu’on est en train d’exécuter pour trouver la deuxième.

Je suis absolument pas expert sur nodejs, je ne connais que très mal, mais vu que le problème semble plus du coté php, le standard sur jeedom voudrait plutôt qu’on écrive la fonction stop comme ceci:

public static function deamon_stop() {
   $pid_file = jeedom::getTmpFolder(__CLASS__) . '/deamon.pid'; //seulement si le démon a bien écrit son PID dans ce fichier au démarrage (ce qui est une convention)
   if (file_exists($pid_file)) {
      $pid = intval(trim(file_get_contents($pid_file)));
      system::kill($pid); // car du coup ca permet de kill le bon process directement
   }
   system::kill('jeedomdsc.js'); //sinon c'est cette ligne qui fera la magie
   system::fuserk(config::byKey('socketport', __CLASS__)); // en dernier recours un kill via le port du socket ouvert mais de nouveau ceci est à adapter en fonction de ce que ce plugin fait (sauve-t-il le port du socket dans une config ou pas?)
}

bref, vu que je ne connais pas plus que ca le plugin, la seule commande qui devrait fonctionner à coup sur c’est

system::kill('jeedomdsc.js');

Et bien c’est exactement ca !
Je suis triplement content,

  1. Que tu ai reussi a me démerder le bouzaing !
  2. Que tu ai repondu aussi vite
  3. Que j’ai réussi avec mes connaissances ultra-limitées à comprendre l’origine du problème

Ca c’est c’est une journée réussie !

Au cas ou @lunarok veuille corriger son code, et faire un push sans aucun changelog c’est écrit plus haut, dans le cas contraire pour les utilisateurs,
via l’outil système >> éditeur de fichiers

dans l’arborescence
HTML / PLUGINS / DSC / CORE / CLASS /
Remplacer le fichier dsc.class.php par celui joint.

ATTENTION cela concerne la version BETA du plugin, je ne sais pas si la modif est compatible avec la version stable.
dsc.class.php.txt (13,1 Ko)
supprimez le .txt à la fin auparavant.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.