Shell-Script lässt sich nicht aufrufen

Begonnen von dantist, 11 Juli 2016, 17:56:40

Vorheriges Thema - Nächstes Thema

dantist

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?

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

dantist

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).

dantist

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.

CoolTux

Statt system( solltest Du qx( verwenden. Dann kannst Du auch Rückgabewerte auswerten.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

JoWiemann

Mal ne Frage: "Was macht das Script und könntest Du das mit Fhem Mitteln nicht eleganter lösen?"

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

dantist

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 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.

JoWiemann

#7
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

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

dantist

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.

Wernieman

Es geht, wenn Du es selber Programmierst ...
http://perldoc.perl.org/Net/Ping.html

Eine Rückmeldung kannst Du übrigens auch über das Script und z.. telnet (nc) erledigen ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html