[英]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.js
和baz.js
?
例如, foo.js
可以執行優雅的啟動,運行process.send('ready')
以將其 pm2 狀態更改為online
。 只有這樣, bar.js
和baz.js
才會由 pm2 啟動。 這將類似於 Docker Compose 的depend_on
參數。
僅通過配置文件不能完成這樣的事情,但 PM2 有一個 可編程的 api允許您執行IPC (進程間通信)。
以下方法是可以使用的:
pm2.list
列出正在運行的進程並獲取它們的名稱/IDpm2.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.