2012-09-08 8 views
18

Mam problemy z uzyskiwanie błąd:Błąd: napisać EPIPE gdy potokiem wyjście do węzła „| głowie”

events.js:48 
     throw arguments[1]; // Unhandled 'error' event 
        ^
Error: write EPIPE 
    at errnoException (net.js:670:11) 
    at Object.afterWrite [as oncomplete] (net.js:503:19) 

gdy potokiem wyjście do głowy. Prosta sprawa, aby ją wypróbować to:

console.log('some string'); 
... the same for 20 lines 

a następnie node test.js | head uzyskać błąd, który wydaje się pojawiają się w około 70% działa na Ubuntu 12.04. Jaki jest problem?

Odpowiedz

15

Komenda head odczytuje tylko kilka pierwszych linii. Twój kod oczekuje, że wszystkie jego dane wyjściowe zostaną odczytane i wyzwoli błąd, jeśli nie może wytworzyć danych wyjściowych. Jeśli dozwolone jest wyrzucanie danych wyjściowych z programu, nie traktuj go jako krytycznego błędu w programie. Jeśli wyrzucanie danych wyjściowych z programu nie jest legalne, nie rób tego do head.

Masz obecnie stan wyścigu. Jeśli head zaczyna ignorować wejście przed zakończeniem zapisywania przez program jego wyjścia, program otrzymuje wyjątek. Jeśli program zakończy zapisywanie swojego wyjścia, zanim head zacznie ignorować jego dane wejściowe, wszystko będzie w porządku.

Jak głupie tymczasowy fix: node test.js | tee /dev/null | head
Teraz tee zajmie całe wyjście programu.

+2

Zobacz moją aktualizację do odpowiedzi. To jest wyścigowy stan. Masz dwie rzeczy, które są całkowicie niezsynchronizowane ('head' zamykające wejście i' test.js' kończące jego wyjście) z zachowaniem, które zmienia się na podstawie tego, co dzieje się jako pierwsze. –

+0

Dzięki, to ma doskonały sens. – Fluffy

+1

Doskonała analiza. –

18

Aby zmienić program, aby pomyślnie zakończyć w przypadku zamkniętej rurze, spróbuj:

process.stdout.on('error', function(err) { 
    if (err.code == "EPIPE") { 
     process.exit(0); 
    } 
}); 
Powiązane problemy