Hauptmenü

Ruby-Skript aufrufen?

Begonnen von oxident, 02 August 2018, 20:55:39

Vorheriges Thema - Nächstes Thema

oxident

Hallo!
Ich versuche verzweifelt, ein Ruby-Skript aus FHEM heraus aufzurufen. Der Einfachheit halber wollte ich lediglich die Aufrufbarkeit des Interpreters mit {qx(ruby -v)} testen, aber schon das scheitert mit einem PERL WARNING: Can't exec "ruby": Datei oder Verzeichnis nicht gefunden at (eval 763) line 1.

Ruby selbst ist natürlich vorhanden und sogar der fhem-user kann es in der Bash ausführen:root@fhem:/opt/fhem# su - fhem
fhem@fhem:~$ ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-linux]

Mir ist aufgefallen, dass dies scheinbar daran liegt, dass bei der Nutzung der Bash diverse Umgebungsvariablen (u.a. PATH) gesetzt werden, jedoch nicht bei der Ausführung von FHEM. Wenn ich den Ruby-Interpreter mit der vollen Pfadangabe in FHEM starte, dann klappt es auch, jedoch findet er dann keine GEMs und auch ein paar sonstige Abhängigkeiten.

Daher meine Frage: Wie kann erreichen, dass FHEM beim Start auch die Umgebungsvariablen des fhem-users erhält?

bugster_de

Ich bin jetzt nicht der Ruby Experte aber ich meine mich dunkel zu errinnern, dass ich für andere Sachen auch bei qx Probleme hatte und nutze deshalb seither immer den system Aufruf.

{system("ruby -v");;}

Ansonsten auch dran denken, dass du das Semikolon am Ende des Befehls zweimal angibst.

Wernieman

Dann gib doch den Ko9mplette Pfad des Interpreters an:
Wo der liegt kannst DU einfach auf der Konsole rausfinden:
Zitatwhereis rubi

Habe keine rubi installiert, kann also nicht sagen, wo es liegt. Wahrscheinlich unter /usr/bin/rubi.
- 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

Otto123

nicht zu vergessen die einfache Methode einfach "Programmname mit Parametern"zu schreiben.
https://commandref.fhem.de/commandref_DE.html#command
Es geht ja primär um FHEM und nicht um Perl?  ;D

Ich empfehle dazu immer einfach ein Shell Script, dort setzt man einfach seine Umgebung wie man sie braucht und ruft es auf mit:
"bash ScriptName.sh"

Übergaben an FHEM macht man dann einfach mit dem zweiten Beispiel in der Commandref in meinem Link. :)

Aber ich habe keine Ahnung von ruby :)

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

oxident

Zitat von: Wernieman am 03 August 2018, 11:33:07
Dann gib doch den Ko9mplette Pfad des Interpreters an:
Ja, dann kann ich prinzipiell auch Ruby aufrufen, nur leider fehlen dem Interpreter dann haufenweise Umgebungsvariablen, z. B. wo er externe Bibliotheken findet.
ZitatIch empfehle dazu immer einfach ein Shell Script, dort setzt man einfach seine Umgebung wie man sie braucht ...
Mein Problem ist, dass ich auch leider nur sehr begrenzt Ahnung von Ruby habe und demnach gar nicht genau weiß, welche Umgebungsvariablen nötig sind. Leider weiß ich nur, dass es läuft, wenn ich es per Bash, also nach Login, ausführe ;-)

Alternativ habe ich gesehen, dass man wohl unter Perl auch "inline" Ruby ausführen kann...

Wernieman

ZitatJa, dann kann ich prinzipiell auch Ruby aufrufen, nur leider fehlen dem Interpreter dann haufenweise Umgebungsvariablen, z. B. wo er externe Bibliotheken findet.
Wenn das wirklich so stimmen würde, würde niemand professionell für Ruby nicht programmiert.

Hintergrund:
Bei jedem Serverdienst werden die Umgebungsvariablen NICHT geladen (übrigens auch nicht bei einem CRON-Aufruf). Probiere es doch einfach mal ;o)
- 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

oxident

Komisch, auch wenn ich ruby über ein Shell-Skript starten will, bewusst ohne Pfadangabe, also so, wie ich es auch direkt per SSH-Sitzung machen würde, klappt es nicht:

#!/bin/bash
# Datei: /opt/fhem/test.sh
ruby -v


2018.08.03 17:30:50 3: eval: {qx(./test.sh)}
./test.sh: Zeile 2: ruby: Kommando nicht gefunden.

Ich denke auch, dass Ruby ja eigentlich für Serveranwendungen gedacht ist und es daher wirklich "bulletproof" sein sollte. Könnte es aber vielleicht daran liegen, auf welche "Art" FHEM gestartet wird?
Es scheint mir, als bekäme FHEM selber ja nichtmal die Umgebungsvariablen die ich bekomme, wenn ich mich selber als user fhem anmelde.

Wernieman

Nochmals: Rufe es mit einem Vollen Pfad auf! Gerade weil es "Pfadangabe" laufen muß ...

Bei einem Serverdienst und fhem ist ein soclher, wird normalerweise die "Standardvariablen" wie z.B. der $PFAD nicht mitgeladen. Ist ein Sicherheitsfeature!

Du hast also 2 Möglichkeiten
1. In Deinem Script das Envirenment einbauen (Starten)
2. Mit vollem Pfad starten

2. ist IMMER besser! Mach Dir doch nicht "das Leben schwer", es ist schon schwer (heiß) genug ...
- 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

oxident

Zitat von: Wernieman am 03 August 2018, 19:18:362. Mit vollem Pfad starten

2. ist IMMER besser! Mach Dir doch nicht "das Leben schwer", es ist schon schwer (heiß) genug ...
Recht hast Du auf jeden Fall. Hatte gehofft, mich nicht soweit in Ruby "reinfuchsen" zu müssen um herauszubekommen, wie ich jetzt innerhalb der Scripts Pfadangaben schreiben muss, aber das wird jetzt wohl bitte nötig...

Danke für Eure Hilfe!