node.js EPIPE исключение для child_process.spawn - PullRequest
3 голосов
/ 12 февраля 2012

Я использую node.js v0.6.10, хотя у меня та же проблема на 0.6.7. Обычно я запускаю дочерний процесс, используя spawn, который запускает другой процесс node.js и взаимодействует через stdout и stdin. Вот два сценария:

родитель (cli.js) :

var spawn = require("child_process").spawn;

var doSpawn = function(callback){
  var child = spawn('child.js');

  child.on('exit', function(code){
    console.log("Child exited with code " + code);
  });

  child.stdin.write("ping");
  child.stdin.end();
};


doSpawn();

setTimeout(function(){}, 10000);

child.js

var run = function(){
  process.stdout.on('drain', function(){
    process.exit(0);
  });

  process.stdout.write(stdout);
};

var stdin = process.stdin;

stdin.resume();
stdin.setEncoding("utf8");

var stdout = '';

stdin.on('data', function(data){
  stdout += data;
});

stdin.on('end', run);

А потом, когда я бегу node cli.js:

$ node cli.js 

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: write EPIPE
    at errnoException (net.js:642:11)
    at Object.afterWrite [as oncomplete] (net.js:480:18)

1 Ответ

3 голосов
/ 12 февраля 2012

Для запуска другого узла процесс * child_process.fork () * рекомендуется http://nodejs.org/docs/latest/api/child_processes.html#child_process.fork

Код с изменениями:

var cp = require("child_process");

var doSpawn = function(callback){
  var child = cp.fork('child.js');

  child.on('exit', function(code){
    console.log("Child exited with code " + code);
  });

  child.stdin.write("ping");
  child.stdin.end();
};


doSpawn();

setTimeout(function(){}, 10000);
...