为什么我通过spawn()挂起创build的Nodesubprocess?

我使用spawn()进行git调用。 有时它可以正常工作,但是其他人似乎是挂起来的。 我没有看到任何事件发生(错误,退出,closures),但我看到证据表明这个过程确实完成了。

var spawn = require('child_process').spawn; spawn('git', ['push', 'origin', 'master']) .on('error', function(error) { console.log("ERROR: DETAILS: " + error); }) .on('close', function(code) { console.log("SUCCESS: CODE: " + code); }) .on('exit', function(code) { console.log("EXIT: CODE: " + code); }) 

事实上,一旦stderr缓冲区超过24kb,您必须从中读取数据,否则您将看不到任何要完成的事件。 可能的解决方法:

  1. 在spawn调用中设置stdio选项。

     spawn('git', ['push', 'origin', 'master'], {stdio: 'ignore'}); 

    请参阅节点ChildProcess文档的所有可能性 – 有很多。

  2. 添加一个(数据)处理程序。

     var git = spawn('git', ['push', 'origin', 'master']); ... git.stderr.on('data', function(data) { // do something with it }); 
  3. 将其pipe理到标准输出/标准错误。 这可能对你的应用程序来说太冗长了,但为了完整性,还要包括它。

     var git = spawn('git', ['push', 'origin', 'master']); ... git.stderr.pipe(process.stderr); git.stdout.pipe(process.stdout);