Попросите Supervisord периодически перезапускать дочерние процессы

Я использую Supervisor (3.0a12) в ubuntu 12.04 для управления рабочими php gearman. Иногда рабочие попадают в странное состояние, когда они используют тонны процессора и оперативной памяти. Пока я разбирался в этой проблеме, я подумал, что было бы неплохо, если бы Supervisor иногда автоматически убивал и обновлял воркеров. Я просмотрел http://supervisord.org/configuration.html документацию по конфигурации и, похоже, не см. любые варианты, которые позволят это сделать.

Кто-нибудь знает, можно ли, чтобы супервизор периодически перезапускал все процессы, которыми он управляет?


person dm03514    schedule 24.09.2012    source источник


Ответы (3)


superlance package предлагает _ 2_ плагин для супервизора. memmon отслеживает использование памяти программами, находящимися под контролем супервизора.

Вы настраиваете memmon как прослушиватель событий супервизора:

[eventlistener:memmon]
command=memmon -a 200MB
events=TICK_60

Приведенная выше конфигурация устанавливает memmon для перезапуска любой программы под управлением супервизора, если она превышает 200 МБ памяти. Проверяет каждые 60 секунд.

Вы можете настроить memmon для мониторинга определенных программ или программных групп, установив ограничения для каждой из них.

person Martijn Pieters    schedule 24.09.2012
comment
Если я использую Supervisor, который использует такой процесс, как xvfb-run, который запускает другой процесс, скажем, xul runner, тогда memmon записывает только память, которая используется xvfb, или все дочерние процессы? - person CMCDragonkai; 29.10.2013
comment
Я считаю, что он будет отслеживать только прямые дочерние процессы. В руководстве указано: memmon не может отслеживать статус процесса для процессов, которые не являются дочерними процессами супервизора. Бегун xul не будет дочерним супервизора, но xvfb-run. - person Martijn Pieters; 29.10.2013
comment
Быстрое сканирование memmon базы кода показывает, что она запрашивает supervisord через RPC для списка управляемых программ и смотрит непосредственно на pid. Думаю, вам придется расширить это, чтобы посмотреть на дочерние процессы этих pid-пакетов. - person Martijn Pieters; 29.10.2013
comment
Я думаю, что нашел запрос на перенос в memmon, посвященный этому? В нем говорится, что он будет отслеживать дерево процессов. github.com/Supervisor/superlance/issues/21 - person CMCDragonkai; 29.10.2013
comment
Да, этот запрос на перенос - это то, что вы ищете; он также будет учитывать все дочерние процессы отслеживаемого процесса. - person Martijn Pieters; 29.10.2013
comment
Еще один вопрос, если у меня есть программный раздел супервизора, использующий numprocs = X, где X - любое число больше 1. Отслеживает ли memmon использование процессов всеми процессами в этом разделе программы или каждым процессом в отдельности? - person CMCDragonkai; 30.10.2013
comment
Исходный код отслеживает память по PID, нигде не накапливает память по нескольким PID. - person Martijn Pieters; 30.10.2013

Вы можете использовать crontab для передачи команд непосредственно supervisorctl. Например, следующее будет перезапускать процесс каждые 20 минут.

0,20,40 * * * * /path/to/supervisorctl restart [supervisor_process]
person scum    schedule 27.07.2013
comment
Это перезапустит процесс, но я подозреваю, что это также убьет, возможно, запущенные мелкие процессы, что может привести к потере данных с ними. (например, с рабочими процессами, а не только с приложениями без сохранения состояния) - person tristanbailey; 10.02.2016
comment
Процессы умирают по многим причинам: в любом случае важно быть устойчивым к неожиданным перезапускам. Так что, если эта стратегия приведет к потере данных, это ошибка, независимо от того, используется ли cron для достижения этого правильного решения. - person jma; 01.03.2016

Есть простое решение только для супервизора. Сделайте другой процесс супервизора, который спит в течение определенного времени, а затем перезапустит нужные вам процессы.

[program:my_program]
process_name = python something.py

[program:periodicrestarter]
command = sh -c "echo 'restart my_program' | supervisorctl;sleep 600"
; restarts all (sleeps first because this restarts itself):
;command = sh -c "sleep 600; echo 'restart all' | supervisorctl"
autorestart = true
person Connor    schedule 20.02.2019
comment
Это хорошая альтернатива принятому ответу, когда единственной причиной перезапуска является не большое использование памяти. - person HosseyNJF; 02.04.2020
comment
Просто небольшое примечание - «перезапустить все» также перезапускает сам периодический перезапуск, так что он может работать не так, как ожидалось. - person bvitya; 06.05.2020