在NodeJS中分叉

时间:2011-10-27 00:20:26

标签: javascript node.js daemon fork

我对如何在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时可用的版本)。现在有一种本地方式来分叉,所以这不再是必要的。 (另外,它似乎也被抛弃了。)

2 个答案:

答案 0 :(得分:9)

child_process.fork()有一个完全误导性的名称,与C的fork()不同。

According to the docs,它作为子进程执行Node.js脚本,并在调用进程和子进程之间建立通信通道。就是这样。

在C中实际生成子进程is done inside libuv,Node的“平台层”,以及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适合您,请继续使用它。

答案 1 :(得分:1)

daemon.node继续在https://github.com/indexzero/daemon.node开发。