web-dev-qa-db-fra.com

Erreur: écrire EPIPE lors de la sortie du noeud de canalisation dans "| head"

J'ai des problèmes pour obtenir l'erreur:

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)

lors du raccordement de la sortie à la tête. Un cas simple pour l'essayer est:

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

puis node test.js | head pour obtenir l'erreur, qui semble apparaître dans environ 70% des exécutions sur Ubuntu 12.04. Quel est le problème?

22
Fluffy

La commande head ne lit que les premières lignes. Votre code s'attend à ce que toute sa sortie soit lue et déclenche une erreur s'il ne peut pas produire de sortie. S'il est légal de jeter la sortie de votre programme, ne la traitez pas comme une erreur fatale dans le programme. S'il n'est pas légal de jeter la sortie de votre programme, ne la redirigez pas vers head.

Vous avez actuellement une condition de concurrence. Si head commence à ignorer l'entrée avant que le programme ait fini d'écrire sa sortie, le programme obtient une exception. Si le programme termine d'écrire sa sortie avant que head commence à ignorer son entrée, tout va bien.

Comme solution temporaire idiote: node test.js | tee /dev/null | head
Maintenant, tee prendra toute la sortie du programme.

18
David Schwartz

Pour modifier le programme pour quitter avec succès dans le cas d'un tuyau fermé, essayez:

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