我正在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
答案 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