簡體   English   中英

使用 PM2 的 Nodejs 應用程序的啟動順序

[英]Startup Sequence of Nodejs Apps using PM2

我正在使用命令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 只有這樣, bar.jsbaz.js才會由 pm2 啟動。 這將類似於 Docker Compose 的depend_on參數。

僅通過配置文件不能完成這樣的事情,但 PM2 有一個 可編程的 api允許您執行IPC (進程間通信)。

以下方法是可以使用的:

  • pm2.list列出正在運行的進程並獲取它們的名稱/ID
  • pm2.launchBus用於接收信息並做出反應的進程
  • pm2.sendDataToProcessId用於向另一個進程發送信息

這樣,您可以運行多個腳本並讓一個等待另一個。 一旦腳本在消息總線上收到一條消息,它就可以使用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));

此致

一點小技巧,你可以在 package.json 里面寫: "start": "pm2 start server.js && pm2 start server1.js" package.json start server1.js" 。 如果您將它作為 npm 啟動運行,它將運行啟動腳本,同樣,您可以創建腳本來停止它。

如果沒有,那么您也可以使用child_process [它默認帶有 nodejs] 通過使用childProcess.exec('pm2 start server.js && pm2 start server1.js');從腳本內部運行命令

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM