Node.js 集群主进程在得到 kill 和 pgrep 后重新启动

Node.js cluster master process reboot after got kill & pgrep?

本文关键字:kill pgrep 重新启动 js 进程 Node      更新时间:2023-09-26

第一个问题:

在 Node.js 集群中,我知道如果集群工作线程崩溃或被杀死,它将使用新实例再次自动启动。但是,如果当主进程被杀死时,如果它被杀死或崩溃,我们如何使主进程再次自动启动怎么办?我试图杀死主进程,整个集群也被杀死了。有没有办法防止这种情况?

if (cluster.isMaster) {
  require('os').cpus().forEach(function () {
    cluster.fork();
  });
  cluster.on('exit', function (worker, code, signal) {
    cluster.fork();
  });
} else if (cluster.isWorker) {
  ...
}

第二个问题:

我想我们可以从process.pid中找到主进程。但是如果没有来自 Node 的这些信息.js并且查看 pgrep -l 节点的输出,我如何确定哪个是主进程 ID?无论如何,当我 fork() 它时我可以标记或命名进程,以便我可以在 pgrep 命令中找到主进程?

$ pgrep -l node
1420 node
1419 node
1418 node
1417 node
1416 node
1415 node
1414 node
1413 node
1412 node

更新

按照@fardjad下面的建议应用 process.title 后,它运行良好。以下是 pgrep 的结果:

  $ pgrep -fl acl
  1994 acl_api_worker_8 USER=nam
  1993 acl_api_worker_7 USER=nam
  1992 acl_api_worker_6 USER=nam
  1991 acl_api_worker_5 USER=nam
  1990 acl_api_worker_4 USER=nam
  1989 acl_api_worker_3 USER=nam
  1988 acl_api_worker_2 USER=nam
  1987 acl_api_worker_1 USER=nam
  1986 acl_api_master SHELL=/bin/bash

我建议您不要监视集群中的主进程,因为您将无法处理SIGKILL。你可以为此使用暴发户monit永远

关于您的第二个问题,您可以设置流程标题:

if (cluster.isMaster)
    process.title = 'master';
    ...
}

有关详细信息,请参阅文档。