如何在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
我正在 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