我有一个Tornado程序,所有相对的python lib安装在一个名为bob的非root用户中:
pip install --user xxx
现在我想在主管中运行它:
[program:testpro]
command=python /path/to/myfile.py
user=bob ; set the user to bob
redirect_stderr=true
stdout_logfile=/path/to/log
numproces=1
autostart=true
但它在supervisorctl状态下失败了:
testpro FATAL Exited too quickly (process log may have details)
我看到日志并发现它无法导入相对的python库,所以它不能像bob一样运行。
然后我改为:
[program:testpro]
command=sudo -u bob -i python /path/to/myfile.py
;user=bob ;comment this
redirect_stderr=true
stdout_logfile=/path/to/log
numproces=1
autostart=true
它运行正常
那么,user
选项有什么作用?以及如何在选项中配置run-as用户?
我已经解决了这个问题:
在程序部分添加environment
选项:
environment=HOME="/home/bob",USER="bob"
见Supervisor doc - Subprocess Environment:
当运行子进程时,supervisord不会执行shell,因此诸如USER,PATH,HOME,SHELL,LOGNAME等环境变量不会更改其默认值或以其他方式重新分配。当您从作为root运行的supervisord运行程序并在配置中使用user =节时,这一点尤为重要。与cron不同,supervisord在对user = program config选项中定义的用户执行setuid时,不会尝试对“基本”环境变量(如USER,PATH,HOME和LOGNAME)进行更新和覆盖。如果需要为特定程序设置可能由特定用户的shell调用设置的特定程序的环境变量,则必须在environment = program config选项中显式执行。设置这些环境变量的示例如下。
[program:apache2]
command=/home/chrism/bin/httpd -c "ErrorLog
/dev/stdout" -DFOREGROUND user=chrism
environment=HOME="/home/chrism",USER="chrism"
您可以使用目录选项。
“当supervisord守护进程时,切换到此目录。此选项可包含值”
[program:testpro]
command=python /path/to/myfile.py
directory=/path/to/
user=bob ; set the user to bob
redirect_stderr=true
stdout_logfile=/path/to/log
numproces=1
autostart=true
不要忘记重新启动supervisord本身,例如/etc/init.d/supervisord restart
,因为否则你的conf更改没有被提取,它将继续以root身份运行你的服务。