【问题标题】:PM2: Stagger process restart for many processesPM2:许多进程错开进程重启
【发布时间】:2021-03-12 20:00:16
【问题描述】:

我正在使用 PM2 来管理我的流程。目前,我有一系列的机器人,每个机器人都有以下基本配置:

{
  "apps" : [
    {
      "name" : "rasa_bot-rasa",
      "script" : "python",
      "pid_file" : "~/rasa_bot/rasa_bot.pid",
      "out_file" : "~/logs/rasa_bot/rasa_bot.log"
      "cron_restart": "0 23 * * Sat"
    },
    #other supporting processes go here, with the same cron_restart
  ]
}

每个机器人都有大约三个支持进程,并且都具有相同的 cron 重启。因此,10 个程序意味着 30 个进程,所有进程同时重新启动。因此,当重新启动时,会使用大量资源,这似乎导致了这个间歇性错误:

2020-11-28T23:00:16: PM2 log: Process with pid <PID here> could not be killed
2020-11-28T23:00:16: PM2 error: app=rasa_bot-rasa id=45 pid=<PID here> could not be stopped
2020-11-28T23:00:16: PM2 error: Process with pid <PID here> already exists
2020-11-28T23:00:16: PM2 error: Error: Process with pid <PID here> already exists
2020-11-28T23:00:16: PM2 log: App [rasa_bot-rasa:45] exited with code [0] via signal [SIGKILL]

这会导致机器人退出,而不是重新启动;它只会有一个“错误”状态。为了解决这个问题,我想设置两件事:

  1. 在 pm2 中滚动重启,它将重新启动一个进程,等待它完成,然后继续下一个进程。
  2. 一种让 pm2 以“错误”状态重新启动进程的方法。

到目前为止,我仍在研究滚动重启,我发现最接近的是集群模式,这似乎不是我想要的。有人对此有什么建议吗?

编辑:有人可以帮忙吗?现在,PM2 没有自动重新启动它,所以我必须解决这个问题的唯一方法是在每个进程出现错误后手动重新启动它。如果我能让它在出现“错误”时重新启动;状态,或者错开重启,这样每个进程就不会一次全部重启,那就太好了。

我在 pm2 日志中遇到这样的错误:

2021-01-17T02:00:11: PM2 log: Process with pid 2627 could not be killed
2021-01-17T02:00:11: PM2 error: app=testbotserver id=3 pid=2627 could not be stopped
2021-01-17T02:00:11: PM2 error: Process with pid 2627 already exists
2021-01-17T02:00:11: PM2 error: Error: Process with pid 2627 already exists
    at Object.God.logAndGenerateError (/home/user/pm2/node_modules/pm2/lib/God/Methods.js:39:12)
    at Object.God.startProcessId (/home/user/pm2/node_modules/pm2/lib/God/ActionMethods.js:295:21)
    at /home/user/pm2/node_modules/pm2/lib/God/ActionMethods.js:439:20
    at /home/user/pm2/node_modules/pm2/lib/God/ActionMethods.js:350:16
    at Timeout._onTimeout (/home/user/pm2/node_modules/pm2/lib/God/Methods.js:176:16)
    at ontimeout (timers.js:482:11)
    at tryOnTimeout (timers.js:317:5)
    at Timer.listOnTimeout (timers.js:277:5)

【问题讨论】:

    标签: cron pm2 restart


    【解决方案1】:

    pm2.reload(process, errback) 正是这样做的!引用自their documentation

    零停机滚动重启。当每个实例单独重新启动时,至少有一个进程将始终保持运行。仅适用于以集群模式启动的脚本。

    请注意,您需要使用cluster mode 才能使用pm2.reload()。您可以使用restart strategies,即发生错误时,重新启动整个应用程序或使用集群模式实现它。

    稍微偏离主题:您还可以使用watch and restart 逻辑,以防您更改正在运行的进程中的任何文件(这将需要重新加载实例)。

    【讨论】:

    • @SVill 希望我的回复能帮到你!如果您还有任何问题,请不要犹豫:-)
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多