javascript NodeJS中的分叉

mdfafbf1  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(99)

我对如何在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()不存在的时候创建的(在编写daemon.node时,v0.1.33是可用的版本)。现在有了一种原生的派生方式,所以这应该不再是必要的。(另外,它似乎也被放弃了。)

2ekbmq32

2ekbmq322#

child_process.fork()有一个完全误导的名称,与C的fork()不同。
根据文档,它将Node.js脚本作为子进程执行,并在调用进程和子进程之间建立通信通道。
子进程is done inside libuv(Node的“平台层”)在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对您有用,请继续使用它。

相关问题