2016-02-12 111 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

相關問題