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