如何使用node-schedule只在一个实例上运行cron?

我的问题是如何使用节点调度来运行一个cron仅在节点服务器的两个实例中的一个实例。 目前它在两个实例上运行,但我希望它只能在一个实例上执行。 那么如何让一个集群只运行一次任务呢? 提前致谢。

{ "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", ....... ....... } } ] } 

你应该使用环境variables。

在你的代码中,你会检查这个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本身提供的环境variablesNODE_APP_INSTANCE ,它需要PM2 2.5。

NODE_APP_INSTANCE环境variables是用来判断进程之间的区别,比如你可能只想在一个进程上运行一个cronjob,你可以直接检查一下process.env.NODE_APP_INSTANCE === 0,因为两个进程永远不可能有相同的编号。

更多信息PM2官方文档在这里 。

Interesting Posts