как использовать node-schedule для запуска cron только на одном экземпляре?

мой вопрос в том, как использовать node-schedule для запуска cron только на одном экземпляре из двух экземпляров node server. В настоящее время он работает на обоих экземплярах, но я хочу, чтобы он выполнялся только на одном экземпляре. Итак, как вы можете заставить кластер выполнить задачу только один раз? Спасибо заранее.

{
  "apps": [
    {
      "name": "Example",
      "script": "boot/app/app.js",
      "watch": false,
      "exec_mode": "cluster_mode",
      "instances": 2,
      "merge_logs": true,
      "cwd": "/srv/www.example.com/server",
      "env": {
        "NODE_ENV": "development",
        .......
    .......
      }
    }
  ]
}

2 ответов


вы должны использовать переменные среды.

в вашем коде вы проверите этот env var:

if(process.env.WITH_SCHEDULE) {
    ...
}

при запуске экземпляров вы установите WITH_SCHEDULE только для одного экземпляра.

пример pm2.в JSON:

{
  "apps": [
    {
      "name": "Example",
      "script": "boot/app/app.js",
      "args": [],
      "error_file": "/srv/www.example.com/logs/error.log",
      "out_file": "/srv/www.example.com/logs/info.log",
      "ignore_watch": [
        "node_modules"
      ],
      "watch": false,
      "cwd": "/srv/www.example.com/server",
      "env": {
        "NODE_ENV": "production",
        "WITH_SCHEDULE": "1",
        "HOST": "127.0.0.1",
        "PORT": "9030"
      }
    },
    {
      "name": "Example",
      "script": "boot/app/app.js",
      "args": [],
      "error_file": "/srv/www.example.com/logs/error.log",
      "out_file": "/srv/www.example.com/logs/info.log",
      "ignore_watch": [
        "node_modules"
      ],
      "watch": false,
      "cwd": "/srv/www.example.com/server",
      "env": {
        "NODE_ENV": "production",
        "HOST": "127.0.0.1",
        "PORT": "9030"
      }
    }
  ]
}

Вы можете использовать переменную среды, предусмотренных PM2 под названием NODE_APP_INSTANCE что требует PM2 2.5.

NODE_APP_INSTANCE переменные среды используется для определения разницы между процессом, например, вы можете запустить задачу cron только на одном процессе, вы можете просто проверить, если процесс.env.NODE_APP_INSTANCE === 0, так как два процесса никогда не могут иметь одинаковое число.

подробнее о PM2 официальный док здесь.