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?
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.
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);
}
});