如何在监管配置文件中添加条件语句

时间:2019-04-10 12:59:21

标签: environment-variables conditional supervisord

我正在linux debian平台上使用supervisor启动python脚本。选择执行脚本的用户应取决于环境变量的值。如何使受监管的配置文件中的“ user =”字段成为条件?

首先,我向超级用户(supervisor.service)添加了一个环境变量SPECIALUSER=myuser(文件/lib/systemd/system/supervisor.service)

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf $OPTIONS reload
KillMode=process
Restart=on-failure
Environment=SPECIALUSER=myuser

然后我尝试在我的supervisord.conf文件中使用该变量:

[program:myprogram]
command=python myscript.py
user="if [ %(ENV_SPECIALUSER)s = myuser]; then root; else standarduser; fi"

但是当我尝试重读supervisord.conf时出现以下错误

ERROR: CANT_REREAD: Invalid user name "if [ myuser = myuser ]; then root; else standarduser; fi" in section 'program:myprogram' (file: '/etc/supervisor/conf.d/supervisord.conf')

正确解释了环境变量,但对bash脚本却没有正确解释。

我考虑过直接在变量Environment=SPECIALUSER=root中输入用户名,但是环境变量并非总是可用。

如果环境变量设置为SPECIALUSER=myuser,则我希望supervisor.d将程序解释为

[program:myprogram]
command=python myscript.py
user=root

在所有其他情况下

[program:myprogram]
command=python myscript.py
user=standarduser

1 个答案:

答案 0 :(得分:0)

根据文档,永远不会“解释”用户参数值或将其发送到Shell。这意味着它将尝试使用整个值作为用户名。

http://supervisord.org/configuration.html#program-x-section-settings

所有参数都不会被解释或发送到外壳。这意味着您通常不能在supervisord.conf的参数中插入条件。

如果您的目标是在不同的平台上使用不同的用户,或者在开发平台上使用一个用户,而在Deploymentserver上使用另一个用户,则建议为该服务创建一个专用用户。

如果您的目标是有时仅以超级用户身份运行,我建议始终在您的supervisord.conf中使用user=root并将程序包装在一个解释该环境变量并相应降低特权的小型Shell脚本中。

另一个SO问题可能会帮助您: https://unix.stackexchange.com/questions/132663/how-do-i-drop-root-privileges-in-shell-scripts