#python-3.x #django #celery #supervisord
Вопрос:
Давайте представим, что у меня есть следующий основной файл /etc/supervisord.conf (пожалуйста, обратите внимание, что для экранирования %s требуется дважды DYNAMIC_VAR
):
[unix_http_server]
file = /tmp/supervisor.sock
[supervisord]
<snip>
environment = STATIC_VAR="foo",
DYNAMIC_VAR="bar_%%s_%%s"
[include]
files = /etc/supervisord.d/worker1.conf
/etc/supervisord.d/worker2.conf
Файлы worker1 и 2:
[program:worker1]
environment = WORKER_1_VAR_1"toto",
WORKER_1_VAR_2="toto_too"
[program:worker2]
environment = WORKER_2_VAR_1"toto",
WORKER_2_VAR_2="toto_too"
(пропуская другое содержимое файла, поскольку оно не имеет отношения к делу)
Моя версия супервайзера-3.4.0 на Centos 7.9. Это выполняется в virtualenv на задней панели Python 3.9.0
ОСНОВНАЯ ЦЕЛЬ: Где-то в коде, выполняемом одним из работников, произойдет что-то подобное («%%s», превращенное в «%s», будет заменено динамическим значением):
from django.conf import settings
final_value = settings.DYNAMIC_VAR % (
'replacement_string_of_some_kind',
'another string'
)
Что происходит, так это то, что вышеизложенное всегда приводит к ошибке при запуске супервизора:
Error: Format string <snip> for 'supervisord.environment' is badly formatted: not enough arguments for format string
ОДНАКО, если я удалю supervisord.environment
раздел из основного файла конфигурации и скопирую его содержимое в отдельные рабочие файлы, запуск произойдет нормально.
Например:
[program:worker1]
environment = STATIC_VAR="foo",
DYNAMIC_VAR="bar_%%s_%%s",
WORKER_1_VAR_1"toto",
WORKER_1_VAR_2="toto_too"
Я делаю что-то не так? Происходит ли какой-то «двойной разбор» при запуске? Можно ли вообще заставить это работать.
Спрашиваю, потому что мой список «глобальных переменных env» довольно длинный, как и мой список работников/программ. Я, очевидно, хотел бы объявить переменные env глобальными для всех работников один раз, а не один раз для каждого работника, поэтому стараюсь сохранить их СУХИМИ…
Идеи приветствуются!