#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]
Это приводит к тому, что бот завершает работу и не возвращается; он просто будет иметь статус «ошибка». Чтобы решить эту проблему, я хотел бы настроить две вещи:
- Непрерывный перезапуск в pm2, при котором он перезапускает процесс, ожидает его завершения, а затем переходит к следующему.
- Способ заставить 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 Надеюсь, мой ответ смог вам помочь! Если у вас остались какие-либо вопросы, не стесняйтесь задавать 🙂