Supervisord拒绝以用户身份运行命令(始终以root身份运行)

3

由于某些原因,supervisor拒绝以user身份启动command,它总是以root用户身份运行,这对我是一个问题,因为我正在激活一个virtualenv并运行特定于该虚拟环境的命令。

所以,我的配置如下:

[program:site]

command = /home/some/virtual/env/dir/run/start.sh
user = some
stdout_logfile = /home/some/etc/supervisor/logs/logging.log
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
stopsignal=KILL
killasgroup=true
autostart=true

start.sh看起来像这样:

#!/bin/bash
echo $USER >> /home/some/user.txt
cd
source /home/foo/some/virtual/env/bin/activate
cd /home/foo/some/virtual/env
SOCKFILE01=/home/some/etc/supervisor/site.sock
exec /home/some/virtual/env/bin/gunicorn -b unix:$SOCKFILE01  site.wsgi:application -w 2 -k gevent --worker-connections=2000 
exit 0

当我检查日志时,我看到:
start.sh: line 2: cd: /root: Permission denied

这意味着它仍在以root身份运行。

我完全不知所措。我以root身份启动了supervisor。更奇怪的是,上面的代码在我的本地机器上完全正常,但在服务器上显示了上面的日志。

我已经没有任何想法... :((

编辑:

在.sh脚本中添加了echo,user.txt输出:

root

完全困惑!


为什么你不直接切换到/home/foo/some/virtual/env目录呢? - Daniel Roseman
@DanielRoseman:我实际上是在start.sh中这样做的-问题是,当Django启动时,它期望一些模块驻留在虚拟环境目录中(在这种情况下是nltk_data)...我不明白为什么supervisor不会以用户身份运行?!?!-为什么它仍然以root身份运行? - JohnJ
@dhke:只是确认一下,我在.sh脚本中添加了echo $USER >> /home/some/user.txt,猜猜我得到了什么?root!! - JohnJ
@JohnJ 环境变量并不可靠,id 命令的输出更可信。但是是的,看起来用户切换功能确实无法正常工作。服务器上有任何 SELinux 限制吗? - dhke
当然,我的评论忽略了echo确认的第一次评估。;-) - Drachenfels
显示剩余3条评论
1个回答

0

您需要设置以下环境变量并更新命令:

[program:site]

command=bash -c "/home/some/virtual/env/dir/run/start.sh"
user=some
stdout_logfile=/home/some/etc/supervisor/logs/logging.log
redirect_stderr=true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8,HOME="/home/some",USER="some"
stopsignal=KILL
killasgroup=true
autostart=true

这个问题在http://supervisord.org/subprocess.html#subprocess-environment中有详细描述,并且解决了我在运行npm脚本时遇到的问题。


非常感谢。注意:我还需要添加一些[rpcinterface:supervisor]的配置。请参考:https://dev59.com/G4_ea4cB1Zd3GeqPOHH7#36091300 - Joel Mellon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接