2012-11-15 7 views
5

Caso specifico:Come fare in modo che un programma in una pipe non venga eseguito finché i primi dati non arrivano senza tempfile?

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

Ciò significa, Ho un programma che generano un output in stdout, e ho messo che su un server remoto con l'arricciatura.

Il problema è che se generate_data richiede troppo tempo, il server sta per tornare 408.

So che i tubi eseguono tutti i comandi senza attendere i dati per essere pronti, quindi la mia prossima iterazione era:

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

Il tempo era il doppio del tempo massimo necessario per eseguire generate_data, quindi tutto è ok. Ma ... non è una soluzione ottimale.

So che posso creare qualcosa di più complesso con la lettura e uno script di shell corretto, ma ho la sensazione che mi manchi qualcosa di ovvio.

Quindi ... Che cosa posso utilizzare al posto dello sleep 20; senza creare un file temporaneo?

+6

quanti dati ci saranno? che ne dici di scrivere un file temporaneo, ad es. 'generate_data> tempfile; curl -T tempfile ... ' –

+0

Sii grato che il' sonno' funzioni! ;-) Buona fortuna a tutti. – shellter

risposta

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

Spiacente, non ho specificato che per le domande, non voglio usare un tempfile. Usando un tempfile, la soluzione corretta, inclusa una pulizia, sarà qualcosa di simile. '' generate_data>/tmp/asdf && curl -T/tmp/asdf http: // server/percorso; ([-f/tmp/asdf && rm/tmp/asdf) '' – Guillermo

+0

Vuoi arricciare l'invio non appena vengono generati i primi dati o vuoi aspettare fino a quando i dati non sono stati generati? In altre parole, il problema è che stai impiegando troppo tempo per generare dati o che c'è qualche processo che accade prima che inizi l'output? – mbarrows