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

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

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

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

3 ответа

Решение

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

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

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

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

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

Мне нужен был простой способ запустить команду из контейнера докера, где нет 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 чаще, чем каждую минуту.

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

Другие вопросы по тегам