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