как использовать 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 официальный док здесь.