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