2016-02-12 118 views
2

我需要从node.js产生一个子进程,并观察它的标准输出一段时间,然后关闭管道(以便节点进程可以终止)。如何在node.js中关闭子进程的stdio管道?

这是我的基本代码(这不会终止节点处理):

const childProcess = require("child_process"); 
const child = childProcess.spawn("httpserver"); 

child.stdout.on("data", (data) => { 
    console.log("child> " + data); 
    // Disconnect Now ... How? 
}); 

我已经试过如下:

  • 使用detached:true选项,并呼吁child.unref()
  • 移除“data”listener

C颂上述变化,但仍然不能正常工作:

const child = childProcess.spawn("httpserver", [], {detached: true}); 
child.stdout.on("data", function cb(data) { 
    console.log("child> " + data); 
    child.stdout.removeListener("data", cb); 
}); 

child.unref(); 

是否有任何其他的方式来从子进程关闭stdout管,并断开?


有点关系:在文档中提到一个child.disconnect() API,但是当我用它上面,我得到一个功能没有发现错误。这是在这里使用的正确的API,为什么在我的情况下不可用?

+0

这可以帮助http://stackoverflow.com/questions/20187184/how-to-kill-childprocess-in-nodejs – AshBringer

+0

@BipBip我不想杀子进程。我需要保持它运行,并从中“分离”节点进程。 – HRJ

回答

1

这一个为我工作。

const fs = require('fs'); 
const spawn = require('child_process').spawn; 
const out = fs.openSync('./out.log', 'a'); 
const err = fs.openSync('./out.log', 'a'); 

const child = spawn('prg', [], { 
    detached: true, 
    stdio: [ 'ignore', out, err ] 
}); 

child.unref(); 

https://nodejs.org/api/child_process.html#child_process_options_detached

+0

这个作品,谢谢!一个小问题是,在文件系统和操作系统中观察文件的变化是不可靠的。但这是探索更多的好起点。 Thx再次。 – HRJ

相关问题