使用 PM2 启动 Node.js 应用程序的启动顺序

4

我正在使用命令pm2 start apps.json来启动多个应用程序。这些应用程序在apps.json中定义:

{
  "apps": [
    {
      "name": "foo",
      "script": "./foo.js",
    },
    {
      "name": "bar",
      "script": "./bar.js",
    },
    {
      "name": "baz",
      "script": "./baz.js",
    }
  ]
}

问题:是否可以定义启动顺序,使得foo.js必须先完成启动,然后才能启动bar.jsbaz.js
例如,foo.js可以执行优雅的启动,运行process.send('ready')以将其pm2状态更改为online。只有这样,pm2才会启动bar.jsbaz.js。这类似于Docker Compose的depend_on参数。

有一些问题会影响可能的方法:1.它们的启动顺序是同步还是异步;2.它们是否公开任何端口;3.它们是否是单例,即可以安全地假定每个系统上只运行一个。 - Eric Wong
2个回答

3
一个简单的方法是在package.json中添加如下代码: "start": "pm2 start server.js && pm2 start server1.js"。通过运行npm start来运行脚本。相似地,您也可以创建停止它的脚本。如果不这样做,您还可以使用child_process模块,在您的脚本中使用childProcess.exec('pm2 start server.js && pm2 start server1.js');命令来运行命令,该模块已经内置于nodejs中。

3
无法仅通过配置文件完成此操作,但是PM2具有编程API,允许您执行IPC(进程间通信)。
以下是要使用的方法:
- pm2.list 列出正在运行的进程并获取它们的名称/ID。 - pm2.launchBus 用于将接收信息并相应地做出反应的进程。 - pm2.sendDataToProcessId 用于向另一个进程发送信息。
这样,您可以运行多个脚本,并使其中一个等待另一个。一旦脚本在message bus上接收到消息,它就可以使用pm2.start启动进程。
下面是一段伪代码来说明我的观点:
const pm2 = require('pm2');

pm2.connect(() => {
  pm2.list(function(err, processes) {
    const fooProcess = processes.find(p => p.name == 'foo');

    pm2.launchBus((err, bus) => {
      bus.on('process:msg', packet => {
        if (packet.startBar === true) {
          pm.start({ script: 'bar.js' }, (err, apps) => { ... })
        }
      });
      bus.on('error', console.error);
    });
  });
});

在另一种脚本中,您将会有以下内容:
pm2.sendDataToProcessId(barProcessID, {
  data : { startBar : true },
  topic: 'process:msg'
}, (err, res) => console.log(err, res));

祝好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接