Как я могу настроить управляемую супервизором программу для ожидания X секунд перед попыткой перезагрузки?


9

У меня есть рабочий процесс, который обрабатывает 1 сообщение RabbitMq одновременно. Прямо сейчас, как только рабочий выходит, супервизор перезапускает его (который обработает следующее сообщение).

Я хотел бы установить интервал X секунд, чтобы супервизор не перезапускался неумышленно, но он ждал определенное количество времени, прежде чем начать работу с другим работником.

Это возможно? Как?

Ответы:


11

Невозможно указать интервал в разделе программы супервизора, но вы могли бы добавить «sleep ()» в свой код, чтобы после того, как программа ожидает в течение указанного периода времени после завершения обработки сообщения.

Если вы не хотите / не можете изменить программный код, вы можете попробовать включить его в скрипт bash, например:

#!/bin/bash
/usr/local/bin/myprogram
sleep 30

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

command=/usr/local/bin/myprogram.sh

Сон не будет выполнен, пока не вернется / usr / local / bin / myprogram?
Лоустро

Точно, только после того, как моя программа выйдет, сон начнет считать.
Яков Сосич

Проблема в том, что этот скрипт не обрабатывает сигналы, в частности, TERM.
Торстен Бронджер

9

Мне нужен был простой способ запустить команду из контейнера докера, где нет cron. Вот что я использую:

[program:runevery]
directory = /my/workdir
command = sh -c "sleep 5;date >>/root/test.ts"
stdout_logfile = /var/log/supervisor/%(program_name)s.log
stderr_logfile = /var/log/supervisor/%(program_name)s.log
autorestart = true
startsecs = 0
exitcodes = 0,1,2

startsecs = 0 гарантирует, что супервизор считает, что команда была успешно запущена, даже если она завершается через несколько секунд. В противном случае супервизор прекратит его перезапуск, думая, что это в цикле.

Вот что вы увидите в /root/date.ts с примером выше:

# tail -f /root/test.ts 
Tue Nov 17 20:42:58 UTC 2015
Tue Nov 17 20:43:04 UTC 2015
Tue Nov 17 20:43:10 UTC 2015
[...]

Настройте сон по своему вкусу и замените «date >> / root / test.ts» на все, что вам нужно.

Это решение также пригодится, если вам нужно запускать cronjob чаще, чем каждую минуту.


+1 за умное решение. Я хочу сделать что-то подобное. К сожалению, это не работает для меня, так как мне нужно получить код завершения в слушателе, используя вызов RPC. К сожалению, супервизор перезапускает программу сразу после выхода, делая код 0, вздох ... Есть еще идеи?
Онема

0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

а потом

supervisorctl -c your_config_file reload

1. вам нужно использовать execкоманду, иначе она будет разветвляться на подпроцесс, sleep 60 && exec your commandи ваш прогресс будет выглядеть следующим образом

$ ps -ef|grep urcmd
work      1818  1698  0 17:35 ?        00:00:00 bash -c sleep 60 && urcmd
work      3872  1818  0 17:36 ?        00:00:00 urcmd

а затем, когда вы используете, supervisorctlчтобы остановить urApp, вы остановите прогресс 1818 и оставите 3872 прогресс сиротами

2. Рекомендую изменить startsecs на 5 больше, чем Sleep Sec, а затем, когда вы запустите это приложение и проверите статус, он покажет вам, что он запускается.

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          STARTING  
otherapp                       RUNNING   pid 13502, uptime 0:00:55

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          RUNNING   pid 13503, uptime 0:00:05
otherapp                       RUNNING   pid 13502, uptime 0:00:65

в противном случае, если вы установите значение меньше секунд сна, при запуске приложения и проверке статуса вы получите статус выполнения, но он все еще находится в режиме ожидания cmd до реального выполнения

3. когда вы меняете файл конфигурации, вам нужно использовать команду reload или просто перезапустить супервизор, чтобы он заработал

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.