PM2: поэтапный перезапуск процесса для многих процессов

#cron #pm2 #restart

#cron #pm2 #перезапуск

Вопрос:

Я использую 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 не перезапускает его автоматически, поэтому единственный способ решить эту проблему — вручную перезапустить каждый процесс после появления ошибки. Если я смогу заставить его перезапускаться при ‘error; состоянии или чередовать перезапуски, чтобы каждый процесс не перезапускался сразу, это было бы здорово.

Я получаю подобные ошибки в журнале 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)
 

Ответ №1:

pm2.reload(process, errback) делает именно это! Цитируется из их документации:

Непрерывный перезапуск с нулевым временем простоя. По крайней мере, один процесс будет постоянно выполняться, поскольку каждый экземпляр перезапускается индивидуально. Работает только для сценариев, запущенных в режиме кластера.

Пожалуйста, обратите внимание, что для использования необходимо использовать кластерный режим pm2.reload() . Вы можете использовать стратегии перезапуска, то есть при возникновении ошибки, для перезапуска всего приложения или его реализации в режиме кластера.

Небольшое отступление от темы: вы также можете использовать логику просмотра и перезапуска в случае изменения каких-либо файлов в запущенном процессе (для чего потребуются экземпляры для перезагрузки).

Комментарии:

1. @SVill Надеюсь, мой ответ смог вам помочь! Если у вас остались какие-либо вопросы, не стесняйтесь задавать 🙂