我想首先说我是一个完整的 NodeJS 菜鸟。
所以,话虽这么说,当我使用 NodeJS 的 Cluster API 和process.exit
. 我也意识到所有这些疑问都与 Unix 本身的行为有关。
我知道这process.exit()
会导致当前进程以“成功”代码退出,0
.
对于我的测试,我有 2 个文件:index.js
和indexWorker.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 社区!
干杯!