SYMCON 4.2 exec aus Script geht nicht mehr

Hallo,

seit Freitag letzter Woche Funktionieren bei mir zwei scripte nicht mehr die per exec oder shell_exec Komandos auf meinem Raspberry PI aufgerufen haben.

Im log steht z. B. folgendes:

b>Warning: shell_exec(): Unable to execute ‚echo „statclose“|nc 192.168.200.181 5123‘ in /var/lib/symcon/scripts/47250.ips.php on line 6

Wenn ich das Kommando aber direkt am Raspi ausführe kommt das:

root@rpi-symcon:/var/log/symcon# echo „statclose“|nc 192.168.200.181 5123

Hilfe durch Eingabe von help

Puffer Oben : 79.60
Puffer Mitte : 61.20
Puffer Unten : 54.80
Boiler : 0.00
Kessel : 41.40
Puffer Ladezst: 70.00%
Abgas : 39.00
Kessel : 41.40
Ruecklauf : 33.40
Brenner : 0.00

Was hat sich geändert das dieses script was seit über einem Jahr funktioniert hat es nun nicht mehr tut?

Liebe Grüße

Ich vermute eher etwas im System selbst. Wir (bzw. PHP) hat an der Funktion keinerlei Änderungen vorgenommen.

PHP: PHP 5 ChangeLog

paresy

Hallo paresy,

Danke für die Rückmeldung, ich habe soeben das System wieder aktualisiert, also rpi-update und aptitude dist-upgrade und dabei wurde symcon Aktualisiert, nach dem Neustart bedingt durch das Kernel Update funktionieren beide Scripts nun wieder!

Was das bloß war?

Liebe Grüße

Hallo,

leider ist das Problem nicht behoben auch mit der aktuellen IPS Version 4.3, nach ca. 12 Stunden Funktionieren beide Scripte nicht mehr und es kommt bei einem z.B. folgender Fehler:

Warning:  shell_exec(): Unable to execute 'echo "statclose"|nc 192.168.200.181 5123' in /var/lib/symcon/scripts/47250.ips.php on line 6

Der Befehl in Zeile 6 lautet:

$ret = explode("
", shell_exec('echo "statclose"|nc 192.168.200.181 5123'));

Der Raspi 3 ist weder überlastet noch ist der Arbeitsspeicher verbrauch irgendwie auffällig.

root@rpi-symcon:~# uptime
 18:56:44 up 7 days,  5:23,  1 user,  load average: 0,45, 0,73, 0,53
root@rpi-symcon:~# ps aux|head -n 1 && ps aux|grep symcon|grep -v grep
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
avahi      674  0.0  0.2   3996  1988 ?        Ss   Aug01   1:11 avahi-daemon: running [rpi-symcon.local]
root      3432 22.0 47.3 929704 449852 ?       Ssl  Aug06 579:29 /usr/bin/symcon service
root@rpi-symcon:~#

Es hängen auch keine scripte:

Nach einem neustart von symcon läuft es wieder aber nie länger als 12 Stunden --> was wurde an IPS verändert weil das Script läuft seit über einem Jahr ohne Fehler?

Liebe Grüße

Ich befürchte eher das sich etwas anderes am System geändert hat. Denn wir haben weder an PHP etwas in IP-Symcon 4.2/4.3 geändert, noch hat PHP etwas an der Funktion geändert (die Funktion kommt direkt nativ von PHP)

paresy

Hallo paresy,

wenn symcon den php exec Befehl nicht mehr ausführen kann, ist dieser aber per ssh am pi selbst noch Ausführbar.

Da es nach einem Neustart von Symcon aber wieder Funktioniert nehme ich an das es ein Speicher Management Problem innerhalb von Symcon oder eines abhängigen Paketes ist.

Liebe Grüße

Naja, damit die scripte Laufen muss ich Symcon 4.3 halt nun alle 12 Stunden neu Starten, was schade ist weil ich dachte das dies ein Stabiles System ist und der Hersteller ein Interesse hat es zu verbessern, ich keinerlei hinweise wie ich das Debugen könnte oder Hilfe erhalten habe muss ich das halt hier melden.

Liebe Grüße

Hast du mal mit z.B. lsof geschaut, ob IP-Symcon immer neue Handles leaked? Das ist das einzige, was mir dazu noch einfällt.
Oder die Alternativen zu shell_exec getestet?

Kannst du das Problem schneller nachstellbar machen? Ansonsten sehe ich kaum Chancen, dass wir dieses Problem gelöst bekommen.

paresy

Hallo Paresy,

danke für die Rückmeldung, ich werde beim nächsten Mal wenn der Fehler auftritt mit deinen Tips genauer Analysieren und wieder hier Melden.

Liebe Grüße

nur mal so am Rande, fehlt da nicht der : vorm Port ? 192.168.200.181 : 5123
oder wird der in der Syntax nicht benötigt ?

Hallo Axel,

Danke fürs den Hinweis nur ist beim „nc“ Net cat befehl wie auch bei „telnet“ kein Doppelpunkt nötig sondern eben ein Leerzeichen.

Liebe Grüße

Hallo,

so nun ist es wieder soweit.

exec anstatt shell_exec verursacht nun diesen Fehler:

Warning:  shell_exec(): Unable to execute 'echo "statclose"|nc 192.168.200.181 5123' in /var/lib/symcon/scripts/47250.ips.php on line 7

Und lsof liefert so viele offene File handles von Symcon:

lsof|grep symcon|wc -l
4946

30 Sekunden später

root@rpi-symcon:~# lsof|grep symcon|wc -l
4581

Und nach wie vor kein Thread der hängt also

Nun den symcon Dienst neu gestartet und wieder lsof ausgeführt:

root@rpi-symcon:~# service symcon restart
root@rpi-symcon:~# lsof|grep symcon|wc -l
1657
root@rpi-symcon:~# lsof|grep symcon|wc -l
1852
root@rpi-symcon:~# lsof|grep symcon|wc -l
1853
root@rpi-symcon:~# lsof|grep symcon|wc -l
1827
root@rpi-symcon:~# lsof|grep symcon|wc -l
1827
root@rpi-symcon:~# lsof|grep symcon|wc -l
4055
root@rpi-symcon:~# lsof|grep symcon|wc -l
4452
root@rpi-symcon:~# lsof|grep symcon|wc -l
4809

Und wenn ich nun das Script zum Auslesen der Heizkessel Werte Ausführe läuft es in 124ms durch ohne Feher…

Das Script sieht im ganzen so aus:

<?
include_once(IPS_GetScript(42011 /*[Program\Global\master_include]*/ )["ScriptFile"]);

$id_last_msg = 22868 /*[Datenpunkte\ETA Kessel\Kessel_Werte_Auslesen\last_msg]*/;

$ret = explode("
", shell_exec('echo "statclose"|nc 192.168.200.181 5123'));

if(count($ret) > 0){
	#print_r($ret);
	$id_status = 44976 /*[Datenpunkte\ETA Kessel\Status]*/;
	$id_abgas = 25363 /*[Datenpunkte\ETA Kessel\Abgas]*/;

	writeData($id_abgas, floatval(trim(substr($ret[10], (strpos($ret[10], ":")+1)))));
	writeData(30358 /*[Datenpunkte\ETA Kessel\Kessel]*/, floatval(trim(substr($ret[8], (strpos($ret[8], ":")+1)))));
	writeData(33582 /*[Datenpunkte\ETA Kessel\Puffer Ladezustand]*/, intval(trim(substr($ret[9], (strpos($ret[9], ":")+1)))));
	writeData(55152 /*[Datenpunkte\ETA Kessel\Puffer Mitte]*/, floatval(trim(substr($ret[5], (strpos($ret[5], ":")+1)))));
	writeData(35245 /*[Datenpunkte\ETA Kessel\Puffer Oben]*/, floatval(trim(substr($ret[4], (strpos($ret[4], ":")+1)))));
	writeData(24213 /*[Datenpunkte\ETA Kessel\Puffer Unten]*/, floatval(trim(substr($ret[6], (strpos($ret[6], ":")+1)))));
	writeData(53052 /*[Datenpunkte\ETA Kessel\Rücklauf]*/, floatval(trim(substr($ret[12], (strpos($ret[12], ":")+1)))));
	
	if ((GetValue($id_abgas) > 120) and (GetValue($id_status) < 2)){
	   SetValue($id_status, 1); // In Betrieb
	}
	if (GetValue($id_abgas) < 120){
	   SetValue($id_status, 0); // Aus
	}
} else {
	if((time() - GetValue($id_last_msg)) > 3600){
	   // Eta Service auf Raspberry PI beim Kessel neu starten...
	   // Es muss der ssk key auf dem rpi-eta Rechner kopiert werden! (ss-copy-id)
	   exec("ssh rpi-eta killall -9 ETADat");
	   
	   PK_sendTextNotification("peter", "Telegram", "Kessel Status Auslesen Fehlgeschlagen!");
	   SetValue($id_last_msg, time());
	}
}

function writeData($id, $val){
	if(GetValue($id) != $val){
	   SetValue($id, $val);
	}
}
?>

Danke für die Hilfe im Voraus!

Liebe Grüße

bei „telnet“ kein Doppelpunkt nötig sondern eben ein Leerzeichen.

ok, hab ich keine Berührung mit, wieder was gelernt

Hallo,

Ich wollte mich mal wieder wegen dem Problem mit dem Fehlerhaften exec Melden.

Keine Ahnung warum aber seit dem letzten Neustart vor 8 Tagen läuft alles ohne Fehler.

Ich habe kein Update installiert und auch sonst kein Script verändert…

Das macht mir nun schon etwas Sorgen…

Liebe Grüße

Hallo,

das Problem ist nach einigen Wochen erneut aufgetreten ohne erkennbaren Grund…

Jetzt habe ich die exec Befehle durch Alternativen ersetzt.

Schade das solche Fehler nicht im Log von Symcon genauer gespeichert werden, aber vielleicht will dies der Hersteller gar nicht.

php Script: exec() Unable to fork