避免在多个程序的 Supervisord 配置中重复

避免在多个程序的 Supervisord 配置中重复

我必须运行同一个应用的多个实例,但设置略有不同。唯一改变的是一个命令行参数。

所以目前我得到的脚本看起来像这样:

[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

如何避免重复相同的设置?

答案1

由于同一程序只有三个实例,且仅在一个参数上有所不同,因此我们可以command像下面这样使用 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。

答案2

我怀疑这不是您想要的,但根据您的最终目标,您可以使用脚本来生成配置。我是系统管理员,不是开发人员,所以请原谅我糟糕的编码习惯。但这允许您只添加一行来添加新应用程序。如果您想更改任何现有指令,您也只需在一个地方执行一次并重新运行脚本。

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

答案3

使用 sed 同时编辑它们。 sed -i -e 's/numprocs=3/numprocs=4/g' your_conf.conf

或者如果使用 vi shift+V+Gshift+:+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永久删除它。将相似的实例保存在单独的文件中会更容易。

这只是我的一点小经验。

相关内容