avoiding repetition in supervisord config for multiple programs

I have to run multiple instances of same app with slightly different settings. Only thing that changes is one command line parameter.

So currently I've got script which looks something like this:

[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

How can I avoid repetition of identical settings?

2
задан 1 April 2016 в 01:24
3 ответа

Поскольку существует только три экземпляра одной и той же программы, которые отличаются только одним аргументом, мы можем использовать расширение строкового выражения Python внутри команды , как показано ниже.

[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.

0
ответ дан 3 December 2019 в 14:30

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

#!/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])
0
ответ дан 3 December 2019 в 14:30

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

Это просто мой небольшой опыт.

0
ответ дан 3 December 2019 в 14:30

Теги

Похожие вопросы