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?
Поскольку существует только три экземпляра одной и той же программы, которые отличаются только одним аргументом, мы можем использовать расширение строкового выражения 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.
Я сомневаюсь, что это именно то, что вы ищете, но в зависимости от ваших конечных целей вы можете использовать сценарий для генерации конфигурации. Я системный администратор, а не разработчик, поэтому извините за плохие методы программирования. Но это позволит вам просто добавить одну строку для добавления нового приложения. Если вы хотите изменить какую-либо из существующих директив, вам также нужно будет сделать это только один раз в одном месте и повторно запустить сценарий.
#!/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
или удалите его навсегда. Даже сгруппировать похожие экземпляры проще, если хранить их в отдельных файлах.
Это просто мой небольшой опыт.