2011-10-27 24 views
9

我有點困惑,如何在創建的NodeJS守護分叉中的NodeJS

我這一呼籲fork()是繼續從那裏呼叫是在一個子進程允許做執行之前創建的守護程序用C父母終止。使用process.fork()process.kill()我無法輕鬆達到同樣的效果。

下面的代碼並沒有做什麼,我期待和休息:

var current_pid, cp = require('child_process'); 
current_pid = process.pid; 
cp.fork(''); 
process.kill(current_pid); 

以下錯誤發出後,我想不通,爲什麼還是發生了什麼:

node.js:202 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: read EBADF 
    at errnoException (net.js:589:11) 
    at Pipe.onread (net.js:335:20) 

問題看起來是process.kill()。消除這一點,這兩個進程繼續愉快地運行。

我知道daemon.node,但是這是在child_process.fork()不存在的時候創建的(v0.1.33是daemon.node寫入時可用的版本)。現在有一種原生的分叉方式,所以這不再是必要的。 (另外,它似乎已被拋棄了。)

回答

9

child_process.fork()完全誤導性名稱,而不是同C的fork()

According to the docs,它執行Node.js腳本作爲子進程並在調用進程和子進程之間建立通信通道。而已。

子進程的實際產卵is done inside libuv,C的節點的「平臺層」,以及fork()本身沒有公開給Node腳本。

簡單,備受改善的方式來守護進程只用了什麼內置到Node.js的可能是這樣的:

if (process.argv[2] !== 'child') { 
    require('child_process').execFile(process.argv[0], [__filename, 'child']); 
    process.exit(); 
} 

setTimeout(function(){ 
    console.log('foo'); 
}, 5000); 

顯然,這是fork()相當不同。如果daemon.node適合你,請繼續使用它。