2012-11-15 2 views
5

Sonderfall:Wie wird ein Programm in einer Pipe nicht ausgeführt, bis die ersten Daten ohne TEMP-Datei eintreffen?

generate_data | curl -T - http://someserver/path 

Das heißt, ich ein Programm, das eine Ausgabe in stdout erzeugen, und ich habe das auf einem Remote-Server mit Curl.

Das Problem ist, dass, wenn generate_data zu viel Zeit in Anspruch nimmt, wird der Server 408.

Ich weiß, zurück gehen, dass Rohre ohne zu warten, alle Befehle ausführen für Daten bereit sein, so dass meine nächste Iteration war:

generate_data | (sleep 20 ; curl -T - http://someserver/path) 

Die Zeit war zweimal die maximale Zeit, die benötigt wird, um generate_data auszuführen, also sind alle Dinge in Ordnung. Aber ... es ist keine optimale Lösung.

Ich weiß, ich kann etwas komplexere mit lesen, und eine richtige Shell-Skript, aber habe das Gefühl, dass ich etwas offensichtlich zu vermissen.

Also ... Was kann ich anstelle der sleep 20; verwenden, ohne eine temporäre Datei zu erstellen?

+6

Wie viele Daten wird es geben? wie wäre es mit dem Schreiben einer temporären Datei, z.B. 'generate_data> temporäre Datei; curl -T tempfile ... ' –

+0

Sei dankbar, dass der' Schlaf' funktioniert! ;-) Viel Glück für jeden. – shellter

Antwort

2
generate_data > /tmp/generated_data; cat /tmp/generated_data | curl -T - http://someserver/path 
+0

Entschuldigung, ich habe das bei den Fragen nicht angegeben, dass ich keine temporäre Datei verwenden möchte. Mit einer temporären Datei wird die richtige Lösung, einschließlich einer Bereinigung, etwas wie sein. "generate_data"/tmp/asdf && curl -T/tmp/asdf http: // Server/Pfad; ([-f/tmp/asdf && rm/tmp/asdf) '' – Guillermo

+0

Willst du, dass curl mit dem Senden beginnt, sobald die ersten Daten generiert wurden oder möchtest du warten bis die Daten fertig sind? Mit anderen Worten, ist das Problem, dass Sie zu lange brauchen, um Daten zu generieren, oder dass ein Prozess stattfindet, bevor eine Ausgabe beginnt? – mbarrows