Mehrere URL's senden
Moderator: Co-Administratoren
-
- Beiträge: 9649
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 697 Mal
- Danksagung erhalten: 1617 Mal
Re: Mehrere URL's senden
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 +++
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 +++
- Henke
- Beiträge: 1520
- Registriert: 27.06.2022, 20:51
- System: CCU
- Hat sich bedankt: 140 Mal
- Danksagung erhalten: 306 Mal
Re: Mehrere URL's senden
"-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 &
Den Output musst du, wenn gebraucht, später über z.B. eine Datei abholen.
wget ( .., &stdout ); läuft weder mit -b, noch mit &
-
- 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
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'");
}
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
Marco
Elektrische Bauteile funktionieren mit Rauch. Der Beweis: tritt der Rauch aus, funktioniert das Bauteil nicht mehr!
Raspberrymatic @ RPi3b+, HmIP mit RPi-RF-MOD
- jmaus
- Beiträge: 9844
- Registriert: 17.02.2015, 14:45
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Dresden
- Hat sich bedankt: 462 Mal
- Danksagung erhalten: 1863 Mal
- Kontaktdaten:
Re: Mehrere URL's senden
Ö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 &");
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 /
-
- Beiträge: 14148
- Registriert: 08.05.2013, 23:33
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Nordwürttemberg
- Hat sich bedankt: 583 Mal
- Danksagung erhalten: 1497 Mal
Re: Mehrere URL's senden
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
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
- Henke
- Beiträge: 1520
- Registriert: 27.06.2022, 20:51
- System: CCU
- Hat sich bedankt: 140 Mal
- Danksagung erhalten: 306 Mal
Re: Mehrere URL's senden
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:
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.
Welche Eventualität ist mit dieser, schnelleren, Version:
Code: Alles auswählen
system.Exec(" wget -b --timeout=10 -O /dev/null -q URL");
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.
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.
- jmaus
- Beiträge: 9844
- Registriert: 17.02.2015, 14:45
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Dresden
- Hat sich bedankt: 462 Mal
- Danksagung erhalten: 1863 Mal
- Kontaktdaten:
Re: Mehrere URL's senden
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.Henke hat geschrieben: ↑04.02.2023, 01:38Welche Eventualität ist mit dieser, schnelleren, Version:nicht abgedeckt?Code: Alles auswählen
system.Exec(" wget -b --timeout=10 -O /dev/null -q URL");
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.Warum sollte auch nicht die Standardausgabe "-O /dev/null" umgeleitet werden, sowie die Ausgabe mit "-q" reduziert werden?
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.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.
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 /
- Henke
- Beiträge: 1520
- Registriert: 27.06.2022, 20:51
- System: CCU
- Hat sich bedankt: 140 Mal
- Danksagung erhalten: 306 Mal
Re: Mehrere URL's senden
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.
OMG
-
- 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
Nur weil ich zu 99% ohne Unfall fahre, kann ich trotzdem mit Airbag und Sicherheitsgurt fahren.Henke hat geschrieben: ↑04.02.2023, 11:08Diese 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.
OMG
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.
- jmaus
- Beiträge: 9844
- Registriert: 17.02.2015, 14:45
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Dresden
- Hat sich bedankt: 462 Mal
- Danksagung erhalten: 1863 Mal
- Kontaktdaten:
Re: Mehrere URL's senden
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.Henke hat geschrieben: ↑04.02.2023, 11:08Daher 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.
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 &");
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 /