1

我想首先说我是一个完整的 NodeJS 菜鸟。

所以,话虽这么说,当我使用 NodeJS 的 Cluster API 和process.exit. 我也意识到所有这些疑问都与 Unix 本身的行为有关。

我知道这process.exit()会导致当前进程以“成功”代码退出,0.

对于我的测试,我有 2 个文件:index.jsindexWorker.js.

如下index.js所示:

var cluster = require('cluster');

if (cluster.isMaster) {

    // Setup the required fork behavior.
    cluster.setupMaster({
            exec: 'indexWorker.js'
    });

    var cpuCount = require('os').cpus().length;

    // Create a worker for each logical core.
    for (var i = 0; i < cpuCount; ++i) {
        cluster.fork({'NODE_ENV': 'development'});
    }

    console.log('Calling process.exit on parent.');
    process.exit();

}

看起来indexWorker.js是这样的:

var cluster = require('cluster');

console.log("Started worker having ID: " + cluster.worker.id);

这是我的问题/疑问:

疑点一

现在,由于我process.exit在父进程上使用,我的理解是所有工作进程都应该成为孤儿进程。但是,首先,在我执行 a 之前,控件不会返回到我的终端窗口^C,尽管父级 ( index.js) 正在立即退出。此外,ps, ps -ax,ps -elf | grep <pattern>似乎不认为有任何节点程序在运行。所以我的疑问是:为什么控件没有返回到终端,为什么没有ps显示任何东西?

疑点二

process.exit如果我从中删除index.js,我的理解是控件不会返回到我的终端,因为尽管父进程完成了它的任务,但子进程正在运行,因此父进程没有退出。这是一个正确的理解还是我错过了什么?

疑点3

如果我从 中删除cluster.fork调用和process.exit()调用index.js,则脚本完成并立即将控制权返回到我的终端窗口,因为index.js在这种情况下并没有做太多事情。

但是,正如您所看到的,indexWorker.js也没有进行任何长时间的操作。它只是打印控制台消息。在这种情况下,为什么进程仍在运行?行为不应该与父母的行为相同,即在脚本完成时退出并最终将控制权返回给终端窗口吗?

我只是在进行node index.js所有这些测试;永远不要将任何进程置于后台。我的测试在 Mac 上运行。

这就是我现在的所有疑问。:)

我基本上一直在通过放置process.exit不同的地方和跑步来进行试验ps,因此我对这些点表示怀疑。如果您还想指出关于父/子进程行为的任何其他事情,而我的疑问并未涵盖,我将不胜感激!它肯定会以某种方式帮助我和社区。

所以,提前感谢 SO 社区!

干杯!

4

0 回答 0