Вопрос или проблема
У меня есть следующая конфигурация для процесса, который должен работать непрерывно. Судя по всему, он работает очень хорошо, но через несколько часов или иногда через несколько минут процесс завершается.
Любая помощь будет высоко оценена.
Конфигурация Supervisord:
[program:action_consumer]
process_name=%(program_name)s_%(process_num)02d
command = php /var/www/the_api/web/index.php actionCron
numprocs = 2
autostart=true
autorestart=true
user=console_api
redirect_stderr=true
stdout_logfile=/var/www/the_api/logs/action_consumer.log
RestartSec=3
Restart=3
WatchdogSec=3
Информация о ОС:
Debian GNU/Linux 8 (jessie)
Файл журналов:
Файл журналов содержит следующую ошибку:
FATAL state, too many start retries too quickly
Важно:
Очевидно, что процесс завершается слишком быстро, это мое требование. Я не хочу запускать скрипт в бесконечном цикле. Является ли установка startretries
допустимым решением?
В случае, если временной интервал для условия гонки был меньше одной секунды, то установка startretries=<число, которое вы хотите>
будет допустимой. Тем не менее, вы можете установить его на гораздо большее значение, если это необходимо. Ниже приведён пример.
[program:test]
startretries=10
Поскольку проблема заключалась в нулевом времени выполнения. Чаще всего скрипты выполняются за 0 секунд, поэтому supervisor завершает их.
Я решил эту проблему, добавив startsecs=0
.
Ответ или решение
Проблема с процессами в Supervisord, которые завершаются после успешного выполнения, может быть связана с несколькими факторами, включая параметры конфигурации и поведение самого скрипта.
Анализ системы и конфигурации
Ваши настройки Supervisord указывают на то, что вы ожидаете, что процессы будут запущены непрерывно. Однако при текущей конфигурации сценарий может завершаться слишком быстро, что приводит к избыточным попыткам его перезапуска. Это и вызывает сообщение об ошибке в логах:
FATAL state, too many start retries too quickly
Возможные решения
1. Параметр startretries
Вы упомянули о настройке startretries
, и это решение может быть полезным в вашем случае. Этот параметр указывает Supervisord, сколько раз он может попытаться перезапустить процесс после его завершения. Если ваше приложение часто завершает свою работу менее чем за секунду, увеличение значения startretries
может помочь избежать частого срабатывания этого лимита.
Пример:
[program:action_consumer]
startretries=10
Это позволит Supervisord 10 раз попробовать перезапустить процесс, прежде чем будет зафиксирована ошибка.
2. Параметр startsecs
Отметим, что добавление параметра startsecs
с нулевым значением также может помочь в вашей ситуации. Параметр startsecs
указывает Supervisord, как долго процесс должен работать после запуска, чтобы считаться успешно запущенным. Если вы установите startsecs=0
, это позволит игнорировать время выполнения вашего скрипта, что особенно полезно, если процесс завершает свою работу очень быстро.
Пример:
[program:action_consumer]
startsecs=0
3. Убедитесь, что процесс подходит для Supervisord
Если ваш скрипт выполняется и завершается успешно, это может означать, что он не предназначен для работы в контексте управления процессами. Подумайте о том, чтобы изменить подход:
- Если этот скрипт выполняет определенную задачу (например, обработку сообщений и пр.), возможно, стоит использовать другой механизм, такой как cron, чтобы запускать его через определенные промежутки времени.
- Если обработка должна происходить непрерывно, рассмотрите возможность изменения логики скрипта, чтобы он содержал цикл, который бы повторял выполнение, до тех пор пока не достигнет конечной цели.
Другие рекомендации
- Мониторинг логов: Регулярно просматривайте логи, чтобы видеть поведение процесса и другие возможные ошибки, которые могут возникать.
- Тестирование: Проведите тестирование различных комбинаций параметров Supervisord, чтобы лучше понять, какая конфигурация лучше соответствует вашим требованиям.
- Обновления ОС и программ: Убедитесь, что ваша версия Debian и сам Supervisord актуальны, так как новые версии могут содержать исправления ошибок и улучшения.
Заключение
Настройка Supervisord для корректного управления процессами может требовать определенной тонкой настройки параметров конфигурации. Увеличение startretries
, использование startsecs=0
и пересмотр логики выполнения вашего скрипта должны помочь решить проблему с его непредсказуемым завершением. Если проблема сохранится, может потребоваться более глубокий анализ логов и тестирование различных сценариев выполнения.