Как обойти "вошел в ФАТАЛЬНОЕ состояние, слишком много запускает попытки слишком быстро" в супервизоре
Я просто тестирую своего супервизора с простой конфигурацией программы:
[program:test]
command=python -c "print 'hello'"
autostart=true
autorestart=true
exitcodes=1
user=ratdon
stdout_logfile=/opt/log/test.log
stderr_logfile=/opt/log/test.log
Начиная мой руководитель как sudo supervisord -n -c /opt/supervisord.conf &
, Но после нескольких порождений он перестает порождать его снова.
2016-02-01 11:17:58,973 CRIT Supervisor running as root (no user in config file)
2016-02-01 11:17:58,973 WARN Included extra file "/opt/test.ini" during parsing
2016-02-01 11:17:58,994 INFO RPC interface 'supervisor' initialized
2016-02-01 11:17:58,994 CRIT Server 'inet_http_server' running without any HTTP authentication checking
2016-02-01 11:17:58,995 INFO supervisord started with pid 19644
2016-02-01 11:17:59,998 INFO spawned: 'test' with pid 19648
2016-02-01 11:18:00,026 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:01,030 INFO spawned: 'test' with pid 19650
2016-02-01 11:18:01,064 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:03,072 INFO spawned: 'test' with pid 19653
2016-02-01 11:18:03,104 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:06,108 INFO spawned: 'test' with pid 19657
2016-02-01 11:18:06,138 INFO exited: test (exit status 0; not expected)
2016-02-01 11:18:07,139 INFO gave up: test entered FATAL state, too many start retries too quickly
Я хочу, чтобы супервизор продолжал перезапускать программу до тех пор, пока я не перестану наблюдать.
Является ли это возможным? Если да, как это сделать?
Есть ли возможность заставить супервизора регистрировать stdout
с отметкой времени или нам нужно поставить отметку времени в stdout
сам?
2 ответа
Я столкнулся с тем же случаем использования при работе в среде микро-сервисов Docker. В моем случае была возможность, что Nginx запустился до того, как была создана его динамически сгенерированная конфигурация.
В настоящее время нет способа позволить Supervisord перезапустить службу до тех пор, пока процесс не начнется успешно.
Однако существует возможный обходной путь с использованием startretries
вариант. С startretries
Опция Supervisord будет перезапускаться указанное количество раз или до тех пор, пока процесс не начнется успешно.
В моем конкретном случае использования время для гонки было меньше секунды, поэтому настройка startretries=2
было достаточно. Однако вы можете установить его на гораздо более высокое значение, если это будет необходимо.
[program:test]
startretries=10
На самом деле лучший способ - назначить приоритет запущенной программе.
[program:x]
priority=1
[program:y]
priority=2
обратите внимание, что более низкие числа указывают на более высокий порядок запуска, и, конечно, включая большое количество повторных попыток