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

How to add conditional statements in supervisord configuration file

我正在 linux debian 平台上用 supervisord 启动一个 python 脚本。选择执行脚本的用户应取决于环境变量的值。如何使 supervisord 配置文件中的字段 "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

根据文档,用户参数值永远不会 "interpreted" 或发送到 shell。这意味着它会尝试使用整个值作为用户名。

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

所有参数都不会被解释或发送到 shell。这意味着您通常不能在 supervisord.conf.

的参数中插入条件。

如果您的目标只是在不同的平台上使用不同的用户,或者一个用于开发,另一个用于部署服务器,我建议为该服务创建一个专用用户。

如果您的目标只是有时 运行 作为超级用户,我建议总是在您的 supervisord.conf 中使用 user=root 并将您的程序包装在一个小的 shell 脚本中,该脚本解释此环境变量并相应地删除权限。

这个其他 SO 问题可能会对您有所帮助: https://unix.stackexchange.com/questions/132663/how-do-i-drop-root-privileges-in-shell-scripts