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

Kam*_*l K 7 cron multiple-instances scheduled-tasks node.js

我的问题是如何使用node-schedule仅在两个节点服务器实例中的一个实例上运行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",
        .......
    .......
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Rah*_*mar 8

您可以使用PM2本身提供的环境变量,NODE_APP_INSTANCE它需要 PM2 2.5。

NODE_APP_INSTANCE 环境变量用于确定进程之间的差异,例如您可能只想在一个进程上运行 cronjob,您可以检查 process.env.NODE_APP_INSTANCE === 0,因为两个进程永远不会有相同的编号。

更多关于PM2官方文档的信息在这里


gal*_*kin 4

您应该使用环境变量。

在您的代码中,您将检查此环境变量:

if(process.env.WITH_SCHEDULE) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当您启动实例时,您将仅为一个实例设置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"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 但这将使其中一个实例无法用于调度。如果调度实例死掉了怎么办?这违背了分布式系统的目的......为了使其健壮并且_以正确的方式_,您应该使用一个中央实体来同步实例,或者让它们相互交谈并就其中一个应该达成共识安排任务。第一个选项(中心实体)更简单且广泛使用。你可以尝试这个:https://github.com/thedeveloper/warlock (2认同)