在NodeJS中分叉

Mat*_*tty 9 javascript fork daemon node.js

关于如何在NodeJS中创建守护进程,我有点困惑

我在调用之前在C中创建了守护进程,fork()它继续执行在子进程中进行调用的地方,允许父进程终止.我不能轻易地使用process.fork()和实现相同的效果process.kill().

以下代码不符合我的预期和中断:

var current_pid, cp = require('child_process');
current_pid = process.pid;
cp.fork('');
process.kill(current_pid);
Run Code Online (Sandbox Code Playgroud)

发出以下错误,我无法弄清楚为什么或发生了什么:

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)
Run Code Online (Sandbox Code Playgroud)

问题调用似乎是process.kill().删除它,两个进程继续愉快地运行.

我知道daemon.node,但这是在child_process.fork()不存在时创建的(v0.1.33是编写daemon.node时可用的版本).现在有一种本地方式来分叉,所以这不再是必要的.(另外,它似乎也被抛弃了.)

s4y*_*s4y 9

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

根据文档,它将Node.js脚本作为子进程执行,并在调用进程和子进程之间建立通信通道.而已.

子进程的实际产生在C中的Node的"平台层" libuv内完成的,并且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);
Run Code Online (Sandbox Code Playgroud)

显然,这是非常不同的fork().如果daemon.node适合您,请继续使用它.