Назад | Перейти на главную страницу

избегая повторения в конфигурации супервизора для нескольких программ

Мне нужно запустить несколько экземпляров одного и того же приложения с немного разными настройками. Единственное, что меняется, - это один параметр командной строки.

Итак, в настоящее время у меня есть сценарий, который выглядит примерно так:

[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

Как избежать повторения одинаковых настроек?

Я сомневаюсь, что это то, что вы ищете, но в зависимости от ваших конечных целей вы можете использовать скрипт для создания конфигурации. Я системный администратор, а не разработчик, так что извините за плохие методы программирования. Но это позволит вам просто добавить одну строку для добавления нового приложения. Если вы хотите изменить любую из существующих директив, вам также нужно будет сделать это только один раз в одном месте и повторно запустить скрипт.

#!/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])

Поскольку существует только три экземпляра одной и той же программы, которые отличаются только одним аргументом, мы можем использовать расширение строкового выражения 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.

Используйте 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 или удалите его навсегда. Даже сгруппировать похожие экземпляры проще, если они хранятся в отдельных файлах.

Это всего лишь мой маленький опыт.