Mehrere URL's senden

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Mehrere URL's senden

Beitrag von MichaelN » 03.02.2023, 17:40

Das "-b" funktioniert aber nur, wenn man keinen Output zurück haben will ?!
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Mehrere URL's senden

Beitrag von Henke » 03.02.2023, 18:15

"-b" ist das schnelle &

Den Output musst du, wenn gebraucht, später über z.B. eine Datei abholen.

wget ( .., &stdout ); läuft weder mit -b, noch mit &

McPan
Beiträge: 222
Registriert: 29.11.2021, 07:04
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 12 Mal
Danksagung erhalten: 44 Mal

Re: Mehrere URL's senden

Beitrag von McPan » 03.02.2023, 19:03

dvb hat geschrieben:
03.02.2023, 15:31
...
Werde es wohl so machen müssen. Irgendwie schade. Es sind im Ganzen über zehn URL's. Hätte mir gewünscht, dass es eine smartere Lösung gäbe,
...
Ok, zugegeben, bei drei URLs hätte ich mir persönlich, getreu dem KISS-Prinzip, noch nicht die Mühe mit einer Schleife gemacht. Bei zehn oder mit dem Wissen, dass es möglicherweise einmal mehr werden, wahrscheinlich schon. Das könnte dann, zusammen mit den Informationen aus den vorherigen Beiträgen, so aussehen:

Code: Alles auswählen

! URL-Liste, jeweils mit | als Trennzeichen
! Falls es sich bei "192.168.XXX.XXX:XXXX" um unterschiedliche IPs handelt, müssen diese aus der Schleife entfernt 
! und stattdessen mit in der URL-Liste angegeben werden
string liste = "eg_kueche|eg_bad|eg_wc";
string url;

foreach (url, liste.Split("|")) {
 system.Exec("wget -b --timeout=10 -q -O /dev/null 'http://192.168.XXX.XXX:XXXX/" # url # "/leave'");
}
Ergänzung:
Die URL-Liste lässt sich in diesem Fall, nach Hinweis von Henke, natürlich noch kompakter gestalten, wenn das redundate "/leave" auch mit in die Schleife wandert.
Ob nun -b oder & die bessere, schnellere oder richtigerer Variante ist, wird sich vermutlich (hoffentlich) im weiteren Diskussionsverlauf ergeben.
Zuletzt geändert von McPan am 04.02.2023, 06:02, insgesamt 1-mal geändert.
Grüße,
Marco

Elektrische Bauteile funktionieren mit Rauch. Der Beweis: tritt der Rauch aus, funktioniert das Bauteil nicht mehr!
Raspberrymatic @ RPi3b+, HmIP mit RPi-RF-MOD

Benutzeravatar
jmaus
Beiträge: 9819
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1856 Mal
Kontaktdaten:

Re: Mehrere URL's senden

Beitrag von jmaus » 04.02.2023, 00:28

Henke hat geschrieben:
03.02.2023, 16:27
timeout kann nicht schaden, aber die -b Option ist wesentlich besser als &
Öhhm, ehrlich gesagt: Nein! Das -b und & sind zwei komplett unterschiedliche paar Schuhe. -b forkt nur das wget in den hintergrund belässt als parent aber ReGa und das & am schluss sagt der ReGa das es einen doppelfork machen soll. Man darf das nicht mit dem & in einer reine Unix/Linux Shell verwechseln. Das & am Ende eines system.Exec() gibt der ReGa eine zusatzinfo um das aufzurufende Programm unabhängig von weiteren Abläufen/Abhängigkeiten die mitunter ansonsten bei blockierenden Subprozessen dem Hauptprozess probleme bereiten könnte.

Und das nutzen des Timeout Parameters ist ehrlich gesagt immer angeraten egal ob du -b oder & nutzt. Dieser weisst wget an nur max. X Sekunden auf serverabfragennzu warten bevor abgebrochen wird. Was man alternativ auch nutzen kann und sogar mitunter nutzen sollte mit wget ist das allgemeine "timeout" shell kommando zu nutzen um wget nach einer festen zeit ggf hart abzubrechen damit es nicht fälschlicherweise durch blockaden ressourcen auf dem host verbraucht oder gar die prozessliste sinnlos mit zombies füllt.

Ausehen würde dann ein solcher aufruf der IMHO die sicherste Variante darstellt wie folgt:

Code: Alles auswählen

system.Exec("timeout 10 wget --timeout=10 URL &");
Damit sollten dann alle eventualitäten abgedeckt sein und das wget in keinem Falle irgendetwas blockieren.
Zuletzt geändert von jmaus am 04.02.2023, 00:55, insgesamt 1-mal geändert.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Mehrere URL's senden

Beitrag von Xel66 » 04.02.2023, 00:55

jmaus hat geschrieben:
04.02.2023, 00:28
Öhhm, ehrlich gesagt: Nein! Das -b und & sind zwei komplett unterschiedliche paar Schuhe.
Ich bedanke mich aus gegebenem Anlass ausdrücklich für die Klarstellung.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Mehrere URL's senden

Beitrag von Henke » 04.02.2023, 01:38

Der Ausdruck "besser" war zu unpräzise von mir. Das liegt daran, das für mich "schneller" meistens "besser" ist.

Welche Eventualität ist mit dieser, schnelleren, Version:

Code: Alles auswählen

system.Exec(" wget -b --timeout=10 -O /dev/null -q URL");
nicht abgedeckt?

Warum sollte auch nicht die Standardausgabe "-O /dev/null" umgeleitet werden, sowie die Ausgabe mit "-q" reduziert werden?
Das reduziert im Zweifelsfall doch auch Schreibzugriffe.
jmaus hat geschrieben:
04.02.2023, 00:28
Und das nutzen des Timeout Parameters ist ehrlich gesagt immer angeraten egal ob du -b oder & nutzt.
Immer? Definitiv nicht. Das ist ein Parameter, der von dem Ziel der Abfrage abhängt. Lade ich z.B. ein Update von unbekannter Größe nach, so ist ein generelles Timeout nicht sinnvoll. Für den Connect ja, für den Download nein.

Benutzeravatar
jmaus
Beiträge: 9819
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1856 Mal
Kontaktdaten:

Re: Mehrere URL's senden

Beitrag von jmaus » 04.02.2023, 08:54

Henke hat geschrieben:
04.02.2023, 01:38
Welche Eventualität ist mit dieser, schnelleren, Version:

Code: Alles auswählen

system.Exec(" wget -b --timeout=10 -O /dev/null -q URL");
nicht abgedeckt?
Das hab ich doch versucht oben zu erläutern als ich darauf eingegangen bin, das das & am schluss mehr bzw etwas anderes macht als das gleichnamige & in einer reinen Unix shell. Denke das müsste klar genug gewesen sein, wenn du dir das nochmal durchliest. D.h. also du kannst gerne die -b option verwenden, aber auf das & am Schluss solltesz du definitiv nicht verzichten weil du damit ReGa eine Zusatzinformation gibst was mit dem aufzurufenden Kommando passieren soll und ReGa dann eine andere interne Art des systemaufrufes von Kommandos nutzt.
Warum sollte auch nicht die Standardausgabe "-O /dev/null" umgeleitet werden, sowie die Ausgabe mit "-q" reduziert werden?
Das war doch hier gar nicht das Thema. Es geht/ging hier ganz alleine um den Punkt wie man solche einfachen wget/curl URL abfragekommandos aufruft ohne zu riskieren das diese die ReGa oder das zugrundeliegende Betriebssystem blockieren oder unnötig belasten. Natürlich kann/sollte man solche Ausgabe unterdrückenden Optionen zusätzlich nutzen wenn man an diesen Ausgaben nicht interessiert ist. Aber wie gesagt war das nicht das Thema hier.
jmaus hat geschrieben:
04.02.2023, 00:28
Und das nutzen des Timeout Parameters ist ehrlich gesagt immer angeraten egal ob du -b oder & nutzt.
Immer? Definitiv nicht. Das ist ein Parameter, der von dem Ziel der Abfrage abhängt. Lade ich z.B. ein Update von unbekannter Größe nach, so ist ein generelles Timeout nicht sinnvoll. Für den Connect ja, für den Download nein.
Bei 99% der verwendeten bzw. hier im Forum zu findenden wget/curl aufrufe via system.Exec() ohne Interesse an Rückgabedaten oder einer Erfolgsabfrage geht es darum kurz in einer externen Applikation den Status zu ändern bzw. mitzuteilen das sich etwas verändert hat. Und hierbei reden wir von Dingen die sicherlich max 10-15 Sekunden dauern sollten und ansonsten man davon ausgehen kann das irgendein Fehler aufgetreten ist. Und wenn man das weiss, dann ist es IMHO die bessere Strategie zusätzlich zu kommandointernen timeout Optionen in wget/curl auch noch dieses externe "timeout" Kommando voranzustellen weil dieses sicherstellt das das aufzurufende Kommando nach X sekunden hart gekillt wird um die Ressourcen z.b. für den nächsten Aufruf freizumachen. Und ohne jetzt den quellcode von wget/curl detailliert kontrolliert zu haben wird es sicherlich Stellen in wget/curl geben die trotz der Angabe der kommandointernen timeout wertes dazu führen könnten das das kommando blockiert wird (z.b. bei filesystem zugriffen) und am schluss ein stalling process dabei rauskommt der entweder nur das OS belastet oder im schlimmeren Fall die ReGa. Und deshalb ist es definitiv ein Vorteil bzw ratsam immer das timeout kommando voranzustellen um genau solche Dinge zusätzlich abzusichern.

Wer aber natürlich nicht auf meine Ratschläge hören will, der muss am Ende des Tages bzw irgendwann wohl es erst selbst "fühlen". ;)
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Mehrere URL's senden

Beitrag von Henke » 04.02.2023, 11:08

jmaus hat geschrieben:
04.02.2023, 08:54
das hab ich doch versucht oben zu erläutern
Diese Erläuterung habe ich gelesen und mir darauf hin u.A. auch den "Sinn" eines Doppelforks durchgelesen und mir den Quellcode von wget angesehen.
Bei den Doppelforks wird häufiger die Meinung vertreten, das es keinerlei Sinn macht, wenn der Prozess keine Konsolenzugriffe/Dateizugriffe macht. Dies ist in unserem Fall, insbesondere mit "-o und -q", nicht der Fall und daher IMHO der Doppelfork, der Zeit kostet, nicht nötig.

Daher war die Frage nach einem Beispiel, wie ein "hängen",Processleiche,o.Ä. mit der "-b" ohne "&" zu reproduzieren ist. Nach meinem Kenntnisstand, ist das nicht möglich, aber ich lasse mich mit gerne eines besseren belehren. Allerdings sind dafür Fakten oder noch besser ein konkretes Beispiel der richtige Weg.

Beim Timeout hast du ausführlich erklärt, was ich mit "Das ist ein Parameter, der von dem Ziel der Abfrage abhängt" meine. 99% und auch 99.9999% sind aber nicht "Immer". Das ist einfach ein falscher Ratschlag.
jmaus hat geschrieben:
04.02.2023, 08:54
Wer aber natürlich nicht auf meine Ratschläge hören will, der muss am Ende des Tages bzw irgendwann wohl es erst selbst "fühlen". ;)
OMG

Silverstar
Beiträge: 367
Registriert: 11.02.2020, 12:14
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 94 Mal
Danksagung erhalten: 68 Mal

Re: Mehrere URL's senden

Beitrag von Silverstar » 04.02.2023, 11:27

Henke hat geschrieben:
04.02.2023, 11:08
jmaus hat geschrieben:
04.02.2023, 08:54
das hab ich doch versucht oben zu erläutern
Diese Erläuterung habe ich gelesen und mir darauf hin u.A. auch den "Sinn" eines Doppelforks durchgelesen und mir den Quellcode von wget angesehen.
Bei den Doppelforks wird häufiger die Meinung vertreten, das es keinerlei Sinn macht, wenn der Prozess keine Konsolenzugriffe/Dateizugriffe macht. Dies ist in unserem Fall, insbesondere mit "-o und -q", nicht der Fall und daher IMHO der Doppelfork, der Zeit kostet, nicht nötig.

Daher war die Frage nach einem Beispiel, wie ein "hängen",Processleiche,o.Ä. mit der "-b" ohne "&" zu reproduzieren ist. Nach meinem Kenntnisstand, ist das nicht möglich, aber ich lasse mich mit gerne eines besseren belehren. Allerdings sind dafür Fakten oder noch besser ein konkretes Beispiel der richtige Weg.

Beim Timeout hast du ausführlich erklärt, was ich mit "Das ist ein Parameter, der von dem Ziel der Abfrage abhängt" meine. 99% und auch 99.9999% sind aber nicht "Immer". Das ist einfach ein falscher Ratschlag.
jmaus hat geschrieben:
04.02.2023, 08:54
Wer aber natürlich nicht auf meine Ratschläge hören will, der muss am Ende des Tages bzw irgendwann wohl es erst selbst "fühlen". ;)
OMG
Nur weil ich zu 99% ohne Unfall fahre, kann ich trotzdem mit Airbag und Sicherheitsgurt fahren.
Die "Zeit" in - wieviel? Zwei CPU Takte? lass es auf einem pi sogar ms sein - ist ja wohl bei unseren Anforderungen egal. Da kann man auch den Doppelfork machen.

Und auf der ccu sollte, gerade wenn "Updates unbekannter Größe" geladen werden, dafür gesorgt werden, dass das den Rest nicht stallt. Oder gleich ganz darauf verzichtet werden. Hat auf einer Smarthome-Zentrale vermutlich nichts verloren. Aufrufe, um Status zu setzen oder zu erfragen, sind berechtigt. Aber wenn die länger als ein paar Sekunden dauern, ist da was nicht in Ordnung und kann abgebrochen werden.

Benutzeravatar
jmaus
Beiträge: 9819
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1856 Mal
Kontaktdaten:

Re: Mehrere URL's senden

Beitrag von jmaus » 04.02.2023, 23:27

Henke hat geschrieben:
04.02.2023, 11:08
Daher war die Frage nach einem Beispiel, wie ein "hängen",Processleiche,o.Ä. mit der "-b" ohne "&" zu reproduzieren ist. Nach meinem Kenntnisstand, ist das nicht möglich, aber ich lasse mich mit gerne eines besseren belehren. Allerdings sind dafür Fakten oder noch besser ein konkretes Beispiel der richtige Weg.
Nun, wir können uns nun natürlich noch eine Weile genüsslich über das wieso, weshalb, warum streiten und mit Argumenten und Gegenargumenten versuchen zu überzeugen. Ich kann dir daher jedoch nur auf Grund meiner langjährigen Erfahrungen mit und um die CCU und Linux und meinen Einblicken in den Quellcode von ReGaHss dazu sagen, dass es durchaus sehr gute Gründe gibt das "&" am Ende eines system.Exec() immer zu nutzen wenn man sicherstellen will das der aufgerufene Prozess soweit wie möglich unabhängig von ReGaHss läuft und man somit nicht riskiert das das aufzurufende Kommando komische Effekte gegenüber dem Betriebssystem oder ReGaHss hervorruft.

Ich bleibe daher bei meiner Meinung und meinem generellen Ratschlag das für reine wget/curl aufrufe bei denen man nicht an deren Ausgabe oder Rückgabewert interessiert ist man das folgende Template nutzen sollte:

Code: Alles auswählen

string url="http://XXXXXX";
system.Exec("/usr/bin/timeout 10 /usr/bin/wget -T 10 -O /dev/null -q '" # url # "' &");

Code: Alles auswählen

string url="http://XXXXXX";
system.Exec("/usr/bin/timeout 10 /usr/bin/curl -m 10 -s '" # url # "' >/dev/null &");
Henke hat geschrieben:
04.02.2023, 11:08
Beim Timeout hast du ausführlich erklärt, was ich mit "Das ist ein Parameter, der von dem Ziel der Abfrage abhängt" meine. 99% und auch 99.9999% sind aber nicht "Immer". Das ist einfach ein falscher Ratschlag.
Nun, diese Meinung mag dir gegönnt sein, aber ich möchte trotzdem zu bedenken geben das du hier Ratschläge von jemanden nicht annimmst der zur Zeit der Hauptentwickler von ReGaHss und damit der system.Exec() Funktion ist und vielleicht dadurch in gewisse Dinge tieferen Einblick hat. Wie schon gesagt, du kannst gerne so weiter verfahren wie du möchtest und das & und das "timeout" weglassen und nur die "-b" option verwenden - einfach nur aus dem Prinzip heraus das dir mein Ratschlag nicht passt - aber vielleicht ist ja doch das eine oder andere auch an meinen Aussagen das dich zum Nachdenken anregt. Für die Otto-Normal-Nutzer – für die vieles von dem was wir hier diskutieren böhmische Dörfer sind – und die das hier vielleicht durch die Forensuche finden sollten, sollte es IMHO der bessere Ansatz sein auf meine Ratschläge zu hören.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Antworten

Zurück zu „HomeMatic allgemein“