2012-09-08 8 views
18

estoy teniendo problemas para obtener el error:error: escribir EPIPE cuando las tuberías de salida de nodo a "| cabeza"

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) 

cuando las tuberías de salida de la cabeza. Un caso simple de probarlo es:

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

y luego node test.js | head para obtener el error, que parece estar presente en aproximadamente el 70% se ejecuta en Ubuntu 12.04. ¿Cuál es el problema?

Respuesta

15

El comando head solo lee las primeras líneas. Su código espera que todos sus resultados sean leídos y desencadena un error si no puede producir resultados. Si es legal tirar la salida de su programa, no lo trate como un error fatal en el programa. Si no es legal tirar la salida de su programa, no lo canalice al head.

Actualmente tiene una condición de carrera. Si head comienza ignorando la entrada antes de que el programa termine de escribir su salida, el programa obtiene una excepción. Si el programa termina de escribir su salida antes de que head comience a ignorar su entrada, todo estará bien.

Como una solución temporal tonta: node test.js | tee /dev/null | head
Ahora, tee se llevará a toda la salida del programa.

+2

Ver mi actualización a la respuesta. Es una condición de carrera. Tienes dos cosas que están totalmente desincronizadas ('head' cerrando su entrada y' test.js' terminando su salida) con un comportamiento que varía según lo que ocurra primero. –

+0

Gracias, eso tiene perfecto sentido – Fluffy

+1

Excelente análisis. –

18

para alterar el programa para salir con éxito en el caso de un tubo cerrado, pruebe:

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