Cela fait 2 fois que je constate qu’il doit y avoir un soucis avec ce plugin car la mémoire de mon jeedom augmente petit à petit et un peu trop. Screenshot ci dessous au bout de ~15 jours:
On retombe a quelque chose de normal. Dans les logs, j’ai beaucoup d’erreurs de ce type:
[2021-07-13 20:50:27][INFO] : Plusieurs PID en cours, kill PID Nr : 1270
[2021-07-13 20:51:12][ERROR] : Le cloud à été fermé par eWeLink, tentative de relance du démon.
Je vais faire ça comme workaround en attendant un fix.
Et non pas de deuxième app ouvert ou truc du genre. Par contre je me demande si les mises à jour du module se font bien et ne laisseraient pas de vieux process tourner…
Bonjour,
Je voudrais signaler un bug concernant :
$buf = socket_read($socket, 1024);
socket_read() a une fuite de mémoire de quelques octets à chaque fois qu’elle est appelée.
Quand c’est dans un script, pas de souci, la mémoire est rétablie à la fin.
Par contre si elle est utilisée à l’intérieur d’un démon dans une boucle sans fin ce memory leak fini par croitre dangereusement.
De plus, au début il n’y a pas de fuite, puis au bout de quelques heures, la fuite commence pour, en plus, augmenter.
Au final le système n’a plus de mémoire et il faut relancer le démon pour revenir à la normale (cependant Jeedom semble être équipé de ce qu’il faut car il relance automatiquement le démon).
Si cela peut aider pour ceux qui auraient des pertes de mémoire
tu tests si l’objet $plugin est bien assigné (is_object($plugin)) mais tu l’utilises avant dès les premières lignes de la boucle ce qui n’est pas logique.
Mais de toute façon $plugin sera toujours assigné puisqu’il vient du foreach…
sinon les if imbriqué c’est moche…
il faut donc écrire:
foreach (plugin::listPlugin(true) as $plugin) {
if ($plugin->deamon_info()['state'] != 'ok') continue; // if not ok, check next plugin
$scenario->setLog('>>> Traitement du demon '.$plugin->getName());
// start deamon ...
$plugin->deamon_start(true);
$scenario->setLog('-------------->>>démarrage du demon');
}
bien que je ne vois pas pourquoi tu veux deux logs, ca ne sert à rien.
Personnellement, j’utilise « monit » pour gérer les fuites mémoire.
Voici mon fichier de configuration pour ce plugin qui n’en fait qu’à sa tête.
/etc/monit/conf.d/ewejee
check process ewejee
matching "^node /var/www/html/plugins/ewejee/core/js/newserver.js"
stop program = "/home/pi/scripts/kill-ewejee.sh"
if memory usage > 20% for 1 cycles then stop
Avec le contenu de /home/pi/scripts/kill-ewejee.sh
J’avoue ne pas comprendre le code en php proposé.
Il est indiqué ceci:
if ($plugin->deamon_info()['state'] != 'ok') continue;
Mais en faisant cela, si l’état du plugin n’est pas ok, alors on passe au plugin suivant. Ne serait-ce pas plutôt:
if ($plugin->deamon_info()['state'] == 'ok') continue;
Il faudrait donc écrire:
foreach (plugin::listPlugin(true) as $plugin) {
if ($plugin->deamon_info()['state'] == 'ok') continue; // if ok, check next plugin; if not OK, we start it.
$scenario->setLog('>>> Traitement du demon '.$plugin->getName());
// start deamon ...
$plugin->deamon_start(true);
$scenario->setLog('-------------->>>démarrage du demon');
}
Tout dépend ce que vous voulez faire.
Mais votre code ne répond pas au même « besoin ».
Un problème par exemple: si un démon a été arrêté manuellement et que la gestion auto est désactivée, votre code va démarrer celui-ci.
Ce n’est pas sensé arriver.
C’est bien pour ce genre de problème que ce n’est pas une bonne idée de faire l’apprenti sorcier avec ce genre de script, il y a beaucoup de possibilités de tout casser.