Hauptmenü

qx liefert nichts zurück

Begonnen von petibub, 29 Oktober 2020, 17:58:17

Vorheriges Thema - Nächstes Thema

petibub

Bin froh, dass wir das hinbekommen haben - Danke für die Hilfe!

Wernieman

Zitathabe ich vom Rechner dazukopiert
Wahrscheinlich mit dem user pi, oder root ... und damit eben nicht der User fhem ..
- 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

Christoph Morrison


erech: ~fhem $ stat fhem.pl fhem.cfg
  File: fhem.pl
  Size: 155710    Blocks: 312        IO Block: 4096   regular file
Device: b302h/45826d Inode: 131422      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/      pi)   Gid: ( 1000/      pi)
Access: 2019-01-28 17:50:00.000000000 +0100
Modify: 2019-01-28 07:57:31.000000000 +0100
Change: 2020-10-31 16:12:39.475056437 +0100
Birth: -
  File: fhem.cfg
  Size: 2166      Blocks: 8          IO Block: 4096   regular file
Device: b302h/45826d Inode: 128380      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/      pi)   Gid: ( 1000/      pi)
Access: 2019-01-28 18:09:03.839999791 +0100
Modify: 2019-08-13 14:42:43.608553336 +0200
Change: 2020-10-31 16:12:39.475056437 +0100
Birth: -


→ { my $ret = qx(ping -c 1 -q google.com);; if ($ret =~ /1 received/) { return "gefunden" };; }
→ gefunden

Verstehe es nicht.

Otto123

Danke für eure Erklärung, das bestätigt wenigstens meine Gedanken dazu :)

Die Lösung ist toll - die Ursache verstehe ich auch noch nicht ganz.  ::)  Welches Recht muss man wegnehmen damit dieser Fehler auftritt?
Ein Recht am Pfad (HomeDir) /opt/fhem an sich? 
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

Wernieman

#34
Ich darf Ihn Zitieren:
Zitatsudo chown -R fhem:dialout /opt/fhem/

Ich währe aber niemals auf die Idee gekommen, das ein falscher Benutzer so etwas "ausrichten" kann.

Kleiner Hinweis am Rande:
Ob die Gruppe "dialout" richtig ist, steht auf einem anderen Blatt. Bei mir auf den Systemen jedenfalls ist eigentlich die Gruppe auch fhem ...
- 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

amenomade

#35
Ich glaube nicht, dass das Problem wirklich ein Berechtigungsproblem war. Der TE hat nicht nur die permissions zurückgesetzt (was nicht weh tun kann ;) ), sondern auch Fhem komplett neu gestartet.

Zitat von: betateilchen am 31 Oktober 2020, 11:56:08
qx() liefert undef zurück, wenn entweder die benötigte shell nicht gestartet oder der angegebene Befehl nicht ausgeführt werden kann.
Und wenn keine shell gestartet werden kann (was ich vermute) sollte man keine Fehlermeldung erwarten, geschweige denn ein brauchbares Ergebnis.
Deswegen hätte es keinen Sinn, $? zu testen. Aber $! schon. Und siehe da:
Zitat
Zitat von: amenomade am Heute um 11:32:26

    Interessant wäre vielleicht die Ausgabe von:

    { my $ret = qx(ping -c 1 -q google.com);; return $!}

Das liefert "Cannot allocate memory". Das ist was neues  :-\.
Dies kommt wenn das System nicht genug Speicher hat, um das Kommando zu spawnen. Und natürlich in diesem Fall ergibt es undef in Perl.

Ausserdem muss man sagen: qx() sowie auch system(), starten keine Shell wenn sie es nicht brauchen (sprich wenn keine Shell Metacharacters zu interpretieren sind -  ich dachte es wäre nur wenn überhaupt kein Parameter, deswegen wollte ich mit date statt ping testen, aber mittlerweile habe ich gelesen ;) ), sondern sendet direkt den Befehl an execvp.

Und ein möglicher return code von execvp ist:
ENOMEM
    There's insufficient memory available to create the new process.


EDIT: was mich irritiert, ist dass er keine Hinweise wie "Can't allocate memory" in der Fhem-Log hatte. Aber vielleicht liegt es an der Art des forks, was qx macht.


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Christoph Morrison

@petibub:
Such mal in deinem FHEM-Log ob du da FORK-Meldungen hast.

Dazu machst du auf dem Terminal

grep -c CANNOT_FORK  <hier setzt du deinen Logfile ein, ohne die spitzen Klammern>

Bei mir z.B.:

grep -c CANNOT_FORK /opt/fhem/log/fhem.log

amenomade

Zitat von: Christoph Morrison am 31 Oktober 2020, 19:51:46
@petibub:
Such mal in deinem FHEM-Log ob du da FORK-Meldungen hast.

Dazu machst du auf dem Terminal

grep -c CANNOT_FORK  <hier setzt du deinen Logfile ein, ohne die spitzen Klammern>

Bei mir z.B.:

grep -c CANNOT_FORK /opt/fhem/log/fhem.log

Meiner Meinung nach, wird es nur etwas bringen, wenn Fhem selbst die Notwendigkeit hatte, fhem.pl (also, sich selbst) zu forken, und es nicht geschafft hat. Die Fehlermeldung vom qx fork kommt wahrsecheinlich nicht so weit, dass die Fhem Log sie sieht. Aber die Frage ist interessant... mal sehen, was petibub liefert.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Wernieman

Stimmt, das mit dem reboot hatte ich überlesen ...
- 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

petibub

Zitat von: amenomade am 31 Oktober 2020, 20:02:39
Meiner Meinung nach, wird es nur etwas bringen, wenn Fhem selbst die Notwendigkeit hatte, fhem.pl (also, sich selbst) zu forken, und es nicht geschafft hat. Die Fehlermeldung vom qx fork kommt wahrsecheinlich nicht so weit, dass die Fhem Log sie sieht. Aber die Frage ist interessant... mal sehen, was petibub liefert.

Das liefert bei mir 0, d.h. nichts gefunden.