Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用PM2的Nodejs应用程序的启动顺序_Javascript_Node.js_Ubuntu_Pm2 - Fatal编程技术网

Javascript 使用PM2的Nodejs应用程序的启动顺序

Javascript 使用PM2的Nodejs应用程序的启动顺序,javascript,node.js,ubuntu,pm2,Javascript,Node.js,Ubuntu,Pm2,我正在使用命令pm2 start apps.json在一个命令中启动多个应用程序。这些应用在apps.json中定义: { "apps": [ { "name": "foo", "script": "./foo.js", }, { "name": "bar", "scrip

我正在使用命令
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
can运行
process.send('ready')
将其pm2状态更改为
online
。只有这样,pm2才会启动
bar.js
baz.js
。这将类似于Docker Compose的
depend_on
参数。

仅通过配置文件无法完成此类操作,但PM2有一个允许您执行IPC(进程间通信)的接口

可使用以下方法:

  • pm2.list
    列出正在运行的进程并获取其名称/id
  • pm2.启动总线
    ,用于将接收信息并做出相应反应的流程
  • 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));

最好的问候

一点小技巧,你可以写:
“start”:“pm2 start server.js&&pm2 start server1.js”
包.json
。如果您将其作为npm start运行,它将运行start脚本,类似地,您可以创建脚本来停止它


如果没有,那么您也可以使用
child_-process
[它默认与nodejs一起提供]通过
childProcess.exec('pm2 start server.js&&pm2 start server1.js'),从脚本内部运行命令

有一些问题会影响可能的方法:1。他们的启动顺序是否同步。或异步。;2.它们是否暴露任何端口;3.它们是单例的吗?也就是说,假设每个系统中只有1个运行在单个系统上是否安全。