Hilfe bei Shellaufruf in einem Modul (umstellen auf Non Blocking)

Begonnen von Wuppi68, 28 Oktober 2017, 14:13:26

Vorheriges Thema - Nächstes Thema

Wuppi68

Hallo Zusammen,

in einem Modul (Trädfri) steht folgender Code:
my $coapClientCMD = "timeout 5s coap-client -u Client_identity -k $gwSecret -v 1 -m $method coaps://$gwAddress:5684/$path";

if(%data){
my $jsonData = JSON->new->utf8->encode(\%data);
$coapClientCMD = "echo '$jsonData' | " . $coapClientCMD . " -f -";
}

$coapClientCMD = $coapClientCMD . " 2>/dev/null";

my $return = `$coapClientCMD`;



hat für einen solchen Aufruf schon jemand eine Lösung im Ärmel?

timeout killed nach 5 Sekunden automatisch das aufgerufnene Programm
coap-client bleibt bei diesen Parametern im "tty Input Modus" wartet also auf weitere Eingaben

ergo FHEM ist für 5 Sekunden total blockiert und "nichts" geht mehr

Gruß und Dank

Ralf
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

rudolfkoenig

Falls du an das return Wert interessiert bist: BackendCall.

Oder open(fd, "myCommand|"), fd ins %selectlist einhaengen, und Behandlung im ReadFn. Funktioniert vermutlich nicht unter windows, da pipe da nicht select faehig ist.

Wuppi68

Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

DeeSPe

Ich suche auch gerade eine Lösung um an den return Wert zu kommen.

Mache ich:
my $ret = qx(which ssh);
chomp $ret;

bekomme ich den Pfad zu ssh.

Mit:
my $ret = qx(killall myapp);
Kommt trotz nicht vorhandener Berechtigungen nicht der Fehler zurück der auf der Konsole ausgeworfen wird.

Ich komme hier nicht weiter, benötige aber eben diese Fehlermeldung.

Was ist mit BackendCall gemeint? Habe dazu nichts finden können.

Danke.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Wuppi68

Zitat von: DeeSPe am 10 November 2017, 15:39:01
Ich suche auch gerade eine Lösung um an den return Wert zu kommen.

Mache ich:
my $ret = qx(which ssh);
chomp $ret;

bekomme ich den Pfad zu ssh.

Mit:
my $ret = qx(killall myapp);
Kommt trotz nicht vorhandener Berechtigungen nicht der Fehler zurück der auf der Konsole ausgeworfen wird.

Ich komme hier nicht weiter, benötige aber eben diese Fehlermeldung.

Was ist mit BackendCall gemeint? Habe dazu nichts finden können.

Danke.

Gruß
Dan

Wenn Du nicht den Return Value brauchst kannst Du auch "2>$1" die Errorausgabe umleiten ...
oder Du connectest Dich auf STDOUT(1) und STDERR(2) und hast dann beide Ausgaben getrennt in den Fildeskriptorren
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

DeeSPe

Zitat von: Wuppi68 am 10 November 2017, 16:14:25
Wenn Du nicht den Return Value brauchst kannst Du auch "2>$1" die Errorausgabe umleiten ...
oder Du connectest Dich auf STDOUT(1) und STDERR(2) und hast dann beide Ausgaben getrennt in den Fildeskriptorren

Es geht mir genau um den Rückgabewert (im Fehlerfall), damit ich diesen dem User mitteilen kann.

Wie connecte ich denn auf STDOUT(1) und STDERR(2)?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Wuppi68

Zitat von: DeeSPe am 10 November 2017, 16:22:02
Es geht mir genau um den Rückgabewert (im Fehlerfall), damit ich diesen dem User mitteilen kann.

Wie connecte ich denn auf STDOUT(1) und STDERR(2)?

Gruß
Dan

schau mal hier http://www.perlmonks.org/?node=How%20can%20I%20capture%20STDERR%20from%20an%20external%20command%3F

habe ich auch noch nicht gemacht ;-)
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

DeeSPe

Zitat von: Wuppi68 am 10 November 2017, 16:25:39
schau mal hier http://www.perlmonks.org/?node=How%20can%20I%20capture%20STDERR%20from%20an%20external%20command%3F

Danke für den Link.
Habe jetzt mal einige Beispiele von dort probiert, bekomme aber nach wie vor nicht die Fehlermeldung ausgegeben.
Stelle ich mich denn so an?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

CoolTux

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

DeeSPe

Zitat von: CoolTux am 10 November 2017, 17:57:58
2>&1

Nicht $1

Ich habe kopiert! Da schleicht sich kein $ ein!  :P
Komme leider nach wie vor nicht an die Fehlerausgabe. :o

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Ich glaub jetzt hab ich's.
Manchmal hat man wirklich Tomaten auf den Augen. :P

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

CoolTux

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

DeeSPe

Zitat von: CoolTux am 11 November 2017, 07:22:49
Und was war es, erzähl Mal bitte.

Das ist mir peinlich! ::)

Um es der non-blocking Funktion zuzuführen habe ich das CMD in base64 kodiert.
In meiner Testfunktion hatte ich dann vergessen das encode zu entfernen.... :-[

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

CoolTux

 ;D
Verstehe. Darauf nun ein Bierschen und ein schönes Wochenende gewünscht


Grüße
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

DeeSPe

Irgendwie hakt es immer noch.

Rufe ich mein Shell-CMD sofort im set auf bekomme ich die Fehlermeldung zurück.
Mache ich das Selbe in einem BlockingCall bekomme ich die Fehlermeldung nicht zurück denn die FinishFn wird offensichtlich nicht aufgerufen.
Auch die AbortFn wird nicht aufgerufen.

Ohne BlockingCall:
my $com = $sudo."killall $bin 2>&1";
my @error = qx($com);
Debug "Error: ".join "~~~",@error;

ergibt das bei fehlenden Berechtigungen:
Error: ~~~Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die ~~~Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus: ~~~ ~~~ #1) Resprektieren Sie die Privatsphäre anderer. ~~~ #2) Denken Sie nach bevor Sie tippen. ~~~ #3) Mit großer Macht kommt große Verantwortung. ~~~ ~~~sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben

Genau der selbe Code im BlockingCall kommt nie zurück.

Kann mich bitte jemand erleuchten?

Danke.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe