Plugin Networks: probleme de cron

Hello

Je relance ce thread

Ca fait maintenant 2 mois que ce plugin pédale dans la semoule: le cron fonctionne par moment et parfois pas, parfois le refresh manuel résoud le problème et parfois non.

Perso je monitore 27 devices sur mon LAN en ARP, comme beaucoup je m’en sers combiné au bluetooth et au GPS pour gérer la présence, ca fausse tout…quand ma femme part au boulot elle est encore vue présente au bout de 4h même avec un cron de 5 mins!

Avis aux devs: vous ne pourriez pas faire un rollback sur la dernière modif de @superbricolo ??
Merci!

Le problème avait été résolu via un nouveau PR à priori:

merci @superbricolo pour ton retour
Perso je n’ai pas de problèmes récents de déconnexion/reconnexion mais des problèmes de cron.

A titre d’exemple voila l’historique de présence de ma femme aujourd’hui (elle est partie au boulot ce matin et elle y est tjs…c’est moi qui ai déclenché le refresh de 17h…

Ce problème n’est pas lié au wifi, je l’ai aussi en filaire

Ton scan est en ARP ou en IP? Peut-être que ton scan n’aboutit pas à cause d’un appareil déclaré qui fait bloquer la recherche des autres. Il dit quoi ton cron? As tu des logs?

Bonjour,
Ce problème est chez toi et pas/plus lié au plugin, le bug a été fixé.
Plus qu’à trouver ce qui bloque ce cron

@superbricolo @Mips je ne fais que du ARP. Je viens de relancer les dependances, desactiver et reactiver le plugin en mode debug et rien dans la log pendant 15 mins:

[2020-06-04 18:18:50][INFO] : Début d'activation du plugin
[2020-06-04 18:18:51][INFO] : Info sur le démon : Array (     [launchable_message] =>      [launchable] => nok     [state] => nok     [log] => nok     [auto] => 0 ) 
[2020-06-04 18:18:51][DEBUG] : Lancement de : /var/www/html/core/class/../../core/php/jeePlugin.php  plugin_id=networks function=install callInstallFunction=1

J’ai forcé le refresh de mon Google Nest Hub qui était vu off, il a changé d’état mais rien dans la log
Je suis en v3.3.50 et plugin 2020-05-12 15:07:10

Vos suggestions?

Tu peux faire une copie d’écran de ton cron comme j’ai fait.

@superbricolo voila:

On peut voir que le dernier lancement de ton cron est 19h08. Ce qui n’est pas normal puisque qu’il se lance normalement toute les minutes. Sauf si tu as tardé à envoyer ta copie d’écran. En plus la durée d’exécution est très rapide.
As tu essayé de désactiver le monitorage de la majorité des équipements et d’en remettre que quelques un au faire à mesure pour voir si cela change quelque chose?

Yop, perso je n’est aucune confiance aux table arp, je préférer par dessus tout faire un ping Ip direct, j’arp peut parfois prendre beaucoup de temps à s’update.

Oui j’ai fait ma copie d’écran un instant après. Je n’ai pas trop le temps pour l’instant, je regarderai en detail ce WE. Par contre je m’attendais à avoir des traces du ping ARP en mode DEBUG. Il n’y en a pas dans le code?

Oui chez moi, les arp ne sont pas toujours visible. Je ne sais pas si c’est dû à mon routeur ( Asus RT AC88U)

@rootard Moi aussi je pensais avoir du debug

@superbricolo j’ai pris le temps de désactiver et réactiver mes équipements un par un.
Mes devices sont réapparus sauf certains qui étaient off comme le téléphone de ma fille.
Par contre après qu’elle soit rentrée il était encore off, il a fallu que je force le refresh pour qu’il apparaisse

Le cron tourne bien toutes les minutes, sa dernière execution est bien a l’heure courante mais j’ai tjs 0s de temps d’exécution. Je n’arrive tjs pas a avoir de traces dans la log en mode debug, bizarre non?
J’ai déterminé que la table arp du RPi ne se met pas à jour, l’entrée de son tel n’y est pas, ceci explique peut être cela? pourtant le arping fonctionne…

Je n’ai pas pris le mode arp car pour moi ce n’était pas fiable. Je suis beaucoup mieux en IP
Après pour les logs le plugin n’est peut-être pas très causant à moins qu’il ne faille le désactiver puis le réactiver

1 « J'aime »

J’ai désactivé et réactivé le plugin plusieurs fois ca ne change rien. Il va falloir que je regarde le code…

Suite du feuilleton. J’ai mis des traces dans networks.class.php:

	public static function update() {
		log::add('networks','debug','update(): ' . count(self::byType('networks')) . ' devices');
		foreach (self::byType('networks') as $networks) {
			$autorefresh = $networks->getConfiguration('autorefresh');
			log::add('networks','debug','update():'. $networks->getHumanName() . ' enabled:' . $networks->getIsEnable() . ' autorefresh:' . $autorefresh);
			if ($networks->getIsEnable() == 1 && $autorefresh != '') {
				log::add('networks','debug','update(): debut ping pour: '.$networks->getHumanName());
				try {
					$c = new Cron\CronExpression($autorefresh, new Cron\FieldFactory);
					if ($c->isDue()) {
						try {
							log::add('networks','debug','update(): appel a ping pour: '.$networks->getHumanName());
							$networks->ping();
						} catch (Exception $exc) {
							log::add('networks', 'debug', __('Erreur pour ', __FILE__) . $networks->getHumanName() . ' : ' . $exc->getMessage());
						}
					}
					else
                     log::add('networks','debug','update():'. $networks->getHumanName() . ': next run date:' . $c->getNextRunDate());
				} catch (Exception $exc) {
					log::add('networks', 'debug', __('Expression cron non valide pour ', __FILE__) . $networks->getHumanName() . ' : ' . $autorefresh);
				}
			} else
				log::add('networks','debug','update(): pas de ping pour: '.$networks->getHumanName());
		}
	}

le demon bloque sur certains devices dans la boucle foreach, il ne sort jamais de la ligne:

$c = new Cron\CronExpression($autorefresh, new Cron\FieldFactory);

Ex ici il bloque sur emtec2. Je suis passé en cron5 dans install.php et j’ai réduit le timeout a 10s pour être sur que ce n’est pas la limite des 5 minutes qui bloque mais non

[2020-06-16 21:45:06][DEBUG] : update(): 28 devices
[2020-06-16 21:45:06][DEBUG] : update():[Monitoring][3DS Maxime] enabled:0 autorefresh:*/5 * * * *
[2020-06-16 21:45:06][DEBUG] : update(): pas de ping pour: [Monitoring][3DS Maxime]
[2020-06-16 21:45:06][DEBUG] : update():[Monitoring][Blackstar] enabled:1 autorefresh:*/5 * * * *
[2020-06-16 21:45:06][DEBUG] : update(): debut ping pour: [Monitoring][Blackstar]
[2020-06-16 21:45:06][DEBUG] : update(): appel a ping pour: [Monitoring][Blackstar]
[2020-06-16 21:45:06][DEBUG] : ping():[Monitoring][Blackstar]
[2020-06-16 21:45:22][DEBUG] : ping(): [Monitoring][Blackstar]: 
[2020-06-16 21:45:22][DEBUG] : update():[Monitoring][Canon] enabled:1 autorefresh:*/5 * * * *
[2020-06-16 21:45:22][DEBUG] : update(): debut ping pour: [Monitoring][Canon]
[2020-06-16 21:45:22][DEBUG] : update(): appel a ping pour: [Monitoring][Canon]
[2020-06-16 21:45:22][DEBUG] : ping():[Monitoring][Canon]
[2020-06-16 21:45:37][DEBUG] : ping(): [Monitoring][Canon]: 
[2020-06-16 21:45:37][DEBUG] : update():[Monitoring][Darkstar] enabled:1 autorefresh:*/5 * * * *
[2020-06-16 21:45:37][DEBUG] : update(): debut ping pour: [Monitoring][Darkstar]
[2020-06-16 21:45:37][DEBUG] : update(): appel a ping pour: [Monitoring][Darkstar]
[2020-06-16 21:45:37][DEBUG] : ping():[Monitoring][Darkstar]
[2020-06-16 21:45:38][DEBUG] : ping(): [Monitoring][Darkstar]: 1
[2020-06-16 21:45:38][DEBUG] : update():[Monitoring][Dericam] enabled:1 autorefresh:*/5 * * * *
[2020-06-16 21:45:38][DEBUG] : update(): debut ping pour: [Monitoring][Dericam]
[2020-06-16 21:45:38][DEBUG] : update(): appel a ping pour: [Monitoring][Dericam]
[2020-06-16 21:45:38][DEBUG] : ping():[Monitoring][Dericam]
[2020-06-16 21:45:53][DEBUG] : ping(): [Monitoring][Dericam]: 
[2020-06-16 21:45:53][DEBUG] : update():[Monitoring][ds216] enabled:0 autorefresh:*/5 * * * *
[2020-06-16 21:45:53][DEBUG] : update(): pas de ping pour: [Monitoring][ds216]
[2020-06-16 21:45:53][DEBUG] : update():[Monitoring][Emtec1] enabled:1 autorefresh:*/5 * * * *
[2020-06-16 21:45:53][DEBUG] : update(): debut ping pour: [Monitoring][Emtec1]
[2020-06-16 21:45:53][DEBUG] : update(): appel a ping pour: [Monitoring][Emtec1]
[2020-06-16 21:45:53][DEBUG] : ping():[Monitoring][Emtec1]
[2020-06-16 21:46:09][DEBUG] : ping(): [Monitoring][Emtec1]: 
[2020-06-16 21:46:09][DEBUG] : update():[Monitoring][Emtec2] enabled:1 autorefresh:*/5 * * * *
[2020-06-16 21:46:09][DEBUG] : update(): debut ping pour: [Monitoring][Emtec2]
[2020-06-16 21:50:05][DEBUG] : update(): 28 devices
[2020-06-16 21:50:05][DEBUG] : update():[Monitoring][3DS Maxime] enabled:0 autorefresh:*/5 * * * *
[2020-06-16 21:50:05][DEBUG] : update(): pas de ping pour: [Monitoring][3DS Maxime]
[2020-06-16 21:50:05][DEBUG] : update():[Monitoring][Blackstar] enabled:1 autorefresh:*/5 * * * *
[2020-06-16 21:50:05][DEBUG] : update(): debut ping pour: [Monitoring][Blackstar]

Je n’arrive pas a comprendre pourquoi? pb système? plus de process/threads disponibles?
J’ai verifié plusieurs fois il n’y a pas de caracteres parasites dans les equipements.

Thanks

@Mips @Loic a votre avis pourquoi le code bloque sur la creation d’un nouveau cron? Que puis je verifier niveau config ?
Merci!

Bon le moins qu’on puisse dire c’est que mon problème ne passionne pas les foules.
Pour ceux que ca intéresse j’ai identifié que ca bloque dans $c->isDue() dans la lib 3rd party mtdowling/cron-expression
Je ne sais pas si c’est du a ma version de python? dans le doute j’ai bypassé le problème en remplacant $c->isDue() qui bloque par true

1 « J'aime »

On se calme… on ne sait pas toujours répondre à tout immédiatement… perso je suis pas là à attendre que tu poses une question :wink:

Et si tu veux une investigation de quelqu’un sur ton cas, tu peux aussi faire un ticket.

donc non je n’ai pas d’idée du pourquoi qui me vient en tête là comme ca, je n’explique pas dans l’immédiat.
Surtout que s’il y avait une erreur on devrait avoir l’exception capturée par le catch…

par contre remplacer le isDue par true est une très mauvaise idée: tes crons sur ce plugin n’auront plus aucun effet (pour tous tes équipements) et ils vont donc tous faire un ping chaque minute… (et de toute façon la modif va sauter à la prochaine mise à jour du plugin…)

Je ne veux vexer personne simplement ce problème n’est pas nouveau, je l’avais déja signalé l’an dernier sur l’ancien forum, sans suite.

Je sais que ca n’est pas bien de remplacer ce test mais d’apres ce que j’ai compris il n’y a pas création de thread, tout est synchrone ce qui à mon avis est la source du problème, cf le timestamp dans mes logs:
Le cron est censé tourner toutes les minutes. Comme la boucle foreach de la methode update() est synchrone et le ping aussi, étant donné qu’il prend environ 5s par device je ne vois pas comment tu peux en pinger plus de 12 avant le prochain update…

Certes j’ai perdu le paramètre autorefresh mais au moins ca marche maintenant:
en augmentant le cron du plugin a 5 mins mes 28 devices sont scannés en 3 mins.