Вопрос или проблема
Мне нужно запустить несколько экземпляров одного и того же приложения с немного различными настройками. Единственное, что меняется, это один параметр командной строки.
Итак, у меня есть скрипт, который выглядит примерно так:
[program:thing-one]
command=/usr/local/thing --instance one
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000
[program:thing-two]
command=/usr/local/thing --instance two
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000
[program:thing-three]
command=/usr/local/thing --instance three
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000
Как я могу избежать повторения одинаковых настроек?
Поскольку есть только три экземпляра одной и той же программы, которые различаются только одним аргументом, мы можем использовать развертывание строкового выражения Python внутри command
, как указано ниже.
[program:things]
command=/usr/local/thing --instance %(process_num)s
numprocs=3
user=a_user
stdout_logfile=/var/log/thing.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000
По сравнению с вашей конфигурацией, я изменил две строки и добавил одну.
Кроме того, в документации сказано, что нужно включить данное расширение, если вы используете numprocs
> 1.
Не думаю, что это именно то, что вы ищете, но в зависимости от ваших окончательных целей вы можете использовать скрипт для генерации конфигурации. Я системный администратор, а не разработчик, поэтому извиняюсь за плохие практики кодирования. Но это позволит вам просто добавить одну строку, чтобы добавить новое приложение. Если бы вы захотели изменить любое из существующих директив, вам также пришлось бы сделать это только один раз в одном месте и снова запустить скрипт.
#!/usr/bin/env python
config = "/etc/supervisor/conf.d/my.conf"
f = open(config, 'w')
apps=[
('thing-one','one'),
('thing-two','two'),
('thing-three','three')
]
for name, instance in apps:
line1 = "[program:%s]\n" % name
line2 = "command=/usr/local/thing --instance %s\n" % instance
line3 = "user=a_user\n"
line4 = "stdout_logfile=/var/log/thing.log\n"
line5 = "autostart=true\n"
line6 = "autorestart=true\n"
line7 = "startsecs=10\n"
line8 = "redirect_stderr=true\n"
line9 = "directory=/\n"
line10 = "startretries=1000\n\n"
f.writelines([line1, line2, line3, line4, line5, line6, line7, line8, line9, line10])
Используйте sed, чтобы редактировать их все одновременно.
sed -i -e 's/numprocs=3/numprocs=4/g' your_conf.conf
или если использовать vi shift+V+G
, shift+:+g/numprocs=3/s//numprocs=4/g
Возможно, это не прямой ответ, но в управлении лучше держать каждый блок [program:] в отдельном файле thing-one.conf, thing-two.conf, thing-three.conf.
В случае, если вы захотите отключить один экземпляр, просто выполните mv thing-two.conf thing-two.conf_off
или удалите его навсегда. Даже группировать схожие экземпляры легче, когда они находятся в отдельных файлах.
Это просто мой небольшой опыт.
Ответ или решение
Для решения задачи по минимизации повторений в конфигурационном файле Supervisord при запуске нескольких экземпляров одного и того же приложения, мы можем воспользоваться несколькими подходами. Это поможет снизить дублирование кода и упростить дальнейшее управление конфигурациями. Рассмотрим подробно возможность использования секции program
с параметром numprocs
, создания скрипта для генерации конфигураций, а также другие полезные методы.
Теория
Supervisord предоставляет встроенные возможности для оптимизации конфигураций. Параметр numprocs
в конфигурации позволяет запустить несколько экземпляров программы с минимальными изменениями в коде. При этом за идентификацию каждого процесса отвечает переменная %(process_num)s
, которая подставляется в командную строку программы. Этот метод позволяет сократить код, оставляя общие настройки неизменными.
Пример
Обратите внимание на следующую конфигурацию, которая демонстрирует использование numprocs
:
[program:things]
command=/usr/local/thing --instance %(process_num)s
numprocs=3
user=a_user
stdout_logfile=/var/log/thing_%(process_num)s.log
autostart=true
autorestart=true
startsecs=10
redirect_stderr=true
directory=/
startretries=1000
В этом примере параметр numprocs
указывает на запуск трех экземпляров программы, причем каждый экземпляр получает уникальный номер через переменную %(process_num)s
. Такой подход существенно сокращает дублирование конфигурации.
Применение
Для внедрения данного метода:
- Определите количество экземпляров, которые вам необходимо запустить, и укажите его в
numprocs
. - Измените командную строку с учетом использования переменной
%(process_num)s
, чтобы каждый экземпляр процесса имел отличительные параметры. - Поддерживайте уникальность лог-файлов. Это можно сделать путем добавления
%(process_num)s
в путь к лог-файлу, что упростит анализ логов каждого из процессов в отдельности.
Альтернативные методы
Скрипт для генерации конфигураций
Вы также можете использовать скрипт на Python для автоматической генерации конфигурационных файлов с уникальными настройками. Это становится особенно полезным, когда необходимо часто изменять параметры для нескольких процессов.
Пример скрипта:
#!/usr/bin/env python
configs=[
('thing-one','one'),
('thing-two','two'),
('thing-three','three')
]
config_path = "/etc/supervisor/conf.d/my.conf"
with open(config_path, 'w') as f:
for name, instance in configs:
f.write(f"[program:{name}]\n")
f.write(f"command=/usr/local/thing --instance {instance}\n")
f.write("user=a_user\n")
f.write(f"stdout_logfile=/var/log/{name}.log\n")
f.write("autostart=true\n")
f.write("autorestart=true\n")
f.write("startsecs=10\n")
f.write("redirect_stderr=true\n")
f.write("directory=/\n")
f.write("startretries=1000\n\n")
Этот скрипт гарантирует, что все измененные параметры будут применены сразу ко всем нужным секциям.
Управление с помощью утилит
Для массового редактирования конфигурационных файлов можно использовать команду sed
. Это упрощает процесс одновременного изменения параметров во всех файлах.
sed -i -e 's/numprocs=3/numprocs=4/g' your_conf.conf
Заключение
Применение параметра numprocs
, использование автоматизированных скриптов и командных утилит позволяют значительно упростить управление конфигурациями в Supervisord. Эти методы помогают избежать дублирования, улучшить читаемость и уменьшить вероятность ошибок при изменениях в настройках. Выбирайте подход, наиболее соответствующий вашим задачам и инфраструктуре.