Hallo zusammen,
ich würde einen Cronjob, der ein Script aufruft, gerne in FHEM umsetzen. Es scheitert allerdings am Script-Aufruf, den FHEM immer mit "-1" quittiert - das Script wird nicht ausgeführt.
Ich habe es sowohl mit system("/home/pi/scripts/mtu.sh")
als auch mit system("/bin/bash", "/home/pi/scripts/mtu.sh")
versucht. Das ist die Syntax, die man hier im Forum immer wieder findet. Wo könnte der Fehler liegen? Und blockiert FHEM, solange das aufgerufene Script läuft?
FHEM läuft mit dem User fhem, der darf im home Verzeichnis von pi wahrscheinlich nichts ...
Du musst dem User fhem also Rechte an dem Script geben, Du kannst es auch nach /opt/fhem kopieren und dort starten.
Gruß Otto
Tatsächlich, unter /opt/fhem und mit angepasstem Besitzer läuft das Script :)
Da im Script ein paar Pings abgesetzt werden, die teilweise sekundenlang hängen können, nochmal die Frage: Blockiert das aufgerufene Script FHEM, oder läuft das unabhängig?
Und könnte man ggf. sogar eine Art Callback im Script definieren, auf den FHEM reagiert? Sonst würde ich einfach fest x Sekunden warten, bevor ich die Auswertung der vom Script generierten Ausgabe starte (momentan in ein Textfile, aber als Rückgabe in FHEM wäre es natürlich deutlich eleganter).
Das Script gibt übrigens nur eine Zahl zurück, 0 oder 1. Ich kann in FHEM allerdings nicht darauf zugreifen. Die Funktion sieht so aus:
sub test123() {
my $filename = '/opt/fhem/mtu.sh';
my $result = system($filename);
Log(2, "Result: $result");
Das Logfile sieht so aus:
2016.07.11 22:12:20.160 2: Result: -1
0
Die Antwort 0 wird also ins Log geschrieben, aber in der Variable $result steht immer -1.
Statt system( solltest Du qx( verwenden. Dann kannst Du auch Rückgabewerte auswerten.
Mal ne Frage: "Was macht das Script und könntest Du das mit Fhem Mitteln nicht eleganter lösen?"
Grüße Jörg
Zitat von: CoolTux am 11 Juli 2016, 22:24:11
Statt system( solltest Du qx( verwenden. Dann kannst Du auch Rückgabewerte auswerten.
Mit qx funktioniert es, klasse!
Zitat von: JoWiemann am 11 Juli 2016, 22:34:29
Mal ne Frage: "Was macht das Script und könntest Du das mit Fhem Mitteln nicht eleganter lösen?"
Ich habe seit längerem ein Problem mit meiner DSL-Verbindung (https://forum.fhem.de/index.php/topic,54371.msg459823.html) und prüfe mit dem Script, ob das Problem grade besteht oder nicht. Wenn ja, lasse ich die Fritzbox reconnecten. Es ist nur ein Einzeiler, den ich direkt in FHEM nicht zum Laufen bekomme, daher das externe Script:
ping -M do -c 1 -s 1464 google.com > /dev/null 2>&1; echo $?
Die Zeile gibt 0 aus, wenn der Ping erfolgreich ist.
Du kannst das auch mit dem Modul Presence machen.
define Google PRESENCE lan-ping google.com
Wenn nicht erreichbar wird der Status absent gesetzt. Darauf kannst Du mit einem notify reagieren. Über das Modul FRITZBOX kannst Du dann mit get fritzbox tr064Command DeviceConfig:1 deviceconfig Reboot
die Box neu starten.
Grüße Jörg
Zitat von: JoWiemann am 11 Juli 2016, 23:18:28
Du kannst das auch mit dem Modul Presence machen.
Das funktioniert nicht, da ich nicht den Ping an sich teste, sondern, ob die MTU-Größe der DSL-Verbindung korrekt ausgehandelt wurde. Daher der Parameter "-s 1464".
Gibt es vielleicht eine Möglichkeit, den oben genannten Einzeiler direkt in FHEM aufzurufen? Ich habe es bisher nicht hinbekommen.
Es geht, wenn Du es selber Programmierst ...
http://perldoc.perl.org/Net/Ping.html (http://perldoc.perl.org/Net/Ping.html)
Eine Rückmeldung kannst Du übrigens auch über das Script und z.. telnet (nc) erledigen ....