我想首先说我是一个完整的NodeJS noobie。
因此,正如所说的那样,当我使用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);
以下是我的疑问/疑问:
怀疑1
现在,由于我在父母身上使用process.exit
,我的理解是所有工人流程都应该成为孤儿进程。但是,首先,在我执行^C
之前,控件不会返回到我的终端窗口,尽管父(index.js
)正在立即退出。此外,ps
,ps -ax
,ps -elf | grep <pattern>
似乎并不认为有任何节点程序正在运行。
所以我的疑问是:为什么控制权没有回到终端,为什么ps
没有向我展示任何东西?
怀疑2
如果我从process.exit
中移除index.js
,我的理解是控件不会返回到我的终端,因为尽管父级已经完成了它的任务,但是子进程正在运行,因此父进程没有退出了。这是正确的理解还是我错过了什么?
怀疑3
如果我从cluster.fork
删除了process.exit()
来电和index.js
来电,则脚本会立即完成并将控制权返回到我的终端窗口,因为index.js
没有做太多工作在那种情况下。
但是,正如您所看到的,indexWorker.js
也没有进行任何长时间的操作。它只是打印一个控制台消息。在这种情况下,为什么流程仍在运行?该行为是否应该与父进程相同,即在脚本完成时退出,从而最终将控制权返回给终端窗口?
我只是为所有这些测试运行node index.js
;永远不会在后台放任何进程。我的测试是在Mac上运行。
这就是我现在所有的疑虑。 :)
我基本上一直在尝试将process.exit
放在不同的地方并运行ps
,因此我怀疑这些点。如果您有任何关于父/子过程行为的内容,我怀疑中没有涉及的内容,我将非常感激!它肯定会以某种方式帮助我和社区。
所以,先谢谢SO社区!
干杯!