Назад | Перейти на главную страницу

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

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

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

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

Невозможно указать интервал в разделе программы супервизора, но что вы могли бы сделать, так это вставить "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 секунд больше, чем время сна, затем, когда вы запустите это приложение и проверьте статус, он покажет вам, что он запускается

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