2012-09-08 6 views
18

Ich habe Probleme mit dem Erhalten des Fehlers mit:Fehler: EPIPE schreiben, wenn der Knoten Ausgabe an kochend „| Kopf“

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) 

beim Anschließen von Leitungen Ausgang an Kopf. Ein einfacher Fall, es auszuprobieren ist:

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

und dann node test.js | head die Fehler zu erhalten, die in etwa 70% läuft auf Ubuntu 12.04 zu erscheinen scheint. Was ist das Problem?

Antwort

15

Der Befehl head liest nur die ersten Zeilen. Ihr Code erwartet, dass alle Ausgaben gelesen werden, und löst einen Fehler aus, wenn er keine Ausgabe erzeugen kann. Wenn es legal ist, die Ausgabe von Ihrem Programm zu verwerfen, behandeln Sie es nicht als fatalen Fehler im Programm. Wenn es nicht legal ist, die Ausgabe von Ihrem Programm zu verwerfen, leiten Sie es nicht an head.

Sie haben derzeit eine Wettlaufbedingung. Wenn head anfängt, Eingaben zu ignorieren, bevor das Programm seine Ausgabe beendet, erhält das Programm eine Ausnahme. Wenn das Programm das Schreiben seiner Ausgabe beendet, bevor head anfängt, seine Eingabe zu ignorieren, ist alles in Ordnung.

Als dumme temporäre Lösung: node test.js | tee /dev/null | head
Nun tee nimmt die Ausgabe des Programms alle.

+2

auf die Antwort mein Update finden. Es ist eine Wettlaufbedingung. Sie haben zwei Dinge, die völlig unsynchronisiert sind ('head' schließt seine Eingabe und' test.js' beendet die Ausgabe) mit einem Verhalten, das davon abhängt, was zuerst passiert. –

+0

Danke, das macht perfekt Sinn – Fluffy

+1

Ausgezeichnete Analyse. –

18

das Programm zu ändern, erfolgreich im Falle eines geschlossenen Rohr zu verlassen, versuchen:

process.stdout.on('error', function(err) { 
    if (err.code == "EPIPE") { 
     process.exit(0); 
    } 
}); 
Verwandte Themen