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

9

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

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

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

loostro
источник

Ответы:

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 или просто перезапустить супервизор, чтобы он заработал

Цинсинь Ван
источник