ubuntuusers.de

Für diese Funktion musst du eingeloggt sein.

Pipe Umleitung zu curl

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.10 (Cosmic Cuttlefish)
Antworten |

ckoring

Anmeldungsdatum:
21. Juli 2019

Beiträge: Zähle...

Hallo,

ich habe ein kleines c-Programm welches mir einen Multi-Sensor (Temp, Druck, Feuchte, etc.) ausliest und die Sensorwerte formatiert auf der Konsole ausgibt. Das Programm läuft in einer (Endlos-)schleife. Ausgabe sieht wie folgt aus:

xyz@nnn:~/bsec_bme680_linux $ ./bsec_bme680
'air_properties,room=undefined,test=1 iaq=0.00,temperature=19.98,humidity=67.75,pressure=1013.19'
'air_properties,room=undefined,test=1 iaq=0.00,temperature=19.88,humidity=68.21,pressure=1013.17'
'air_properties,room=undefined,test=1 iaq=0.00,temperature=19.92,humidity=68.09,pressure=1013.22'
...

Nun möchte ich diese Ausgaben zeilenweise per Pipe an curl weiterleiten, um Sie in meiner Influx-Datenbank zu speichern, leider leitet curl nichts weiter. Hier der Aufruf auf der Konsole:

./bsec_bme680 | curl -i -XPOST 'http://192.168.178.44:8086/write?db=metering' --data @-

Ein manuelles senden per echo funktioniert dagegen:

echo 'air_properties,room=undefined,test=1 iaq=0.00,temperature=19.98,humidity=67.75,pressure=1013.19' | curl -i -XPOST 'http://192.168.178.44:8086/write?db=metering' --data @-

Stehe ein bisschen auf dem Schlauch, dachte schon das es an der Schleife liegt, aber andere Programme verarbeiten die Ausgaben zeilenweise wie gewünscht, z.B.:

xyz@nnn:~/bsec_bme680_linux $ ./bsec_bme680 | nl
     1  'air_properties,room=undefined,test=1 iaq=0.00,temperature=20.41,humidity=70.34,pressure=1013.15'
     2  'air_properties,room=undefined,test=1 iaq=0.05,temperature=19.48,humidity=73.68,pressure=1013.32'

Bin für jeden Hinweis dankbar!

mfg Christian

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Die Schleife ist in deinem C-Programm?

Was passiert, wenn du die Abfrage nur einmal durchlaufen lässt bzw. ein paar Mal? Ich vermute, dass curl darauf wartet, dass auf stdin ein EOF kommt oder dass die Pipe zugemacht wird. Jedenfalls irgendein Anzeichen, damit curl weiß, dass der Datenabschnitt zuende ist.

Edit: Die curl manpage macht auf mich den Eindruck, dass man sich -i -XPOST sparen kann, sobald --data Verwendung findet. Dazu fehlt mir aber gerade eine schnelle Möglichkeit zum Testen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11250

Wohnort: München

Wenn du die Daten zeilenweise schicken willst, probier es mal mit einer while Schleife:

1
2
3
4
#!/bin/bash
while read -r line; do
  curl -i -XPOST 'http://192.168.178.44:8086/write?db=metering' --data "$line"
done < <(./bsec_bme680)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13177

Der Grund ist, dass Dein Programm nie fertig ist mit Schreiben und damit curl auch nie fertig werden kann mit Senden. Lösung ist wie von [seahawk1986:] vorgeschlagen. Man kann das auch mit xargs machen (ungetestet, Du kannst erst mal ein echo vor dem curl einfügen):

1
./bsec_bme680 | xargs -rd \\n -L 1 curl -i -XPOST 'http://192.168.178.44:8086/write?db=metering' --data

Das erspart Dir die Schleife mit read.

ckoring

(Themenstarter)

Anmeldungsdatum:
21. Juli 2019

Beiträge: 2

Schon mal danke für die Hinweis. Werde ich ausprobieren!

mfg Christian

Antworten |