我有一个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用户?
答案 0 :(得分:19)
我已经解决了这个问题:
在程序部分添加environment
选项:
environment=HOME="/home/bob",USER="bob"
请参阅Supervisor doc - Subprocess Environment:
运行子进程时,supervisord没有执行shell,所以 环境变量,如USER,PATH,HOME,SHELL,LOGNAME等。 不会更改其默认值或以其他方式重新分配。这是 当你从一个程序运行程序时,特别重要的是要注意 supervisord以root身份运行,配置中包含user =节。 与cron不同,supervisord不会尝试神圣和覆盖 “基本”环境变量,如USER,PATH,HOME和LOGNAME 当它对user = program中定义的用户执行setuid时 配置选项。如果需要为a设置环境变量 特殊程序,否则可能由shell调用设置 对于特定用户,您必须在其中明确地执行此操作 environment =程序配置选项。设置这些的一个例子 环境变量如下。
[program:apache2]
command=/home/chrism/bin/httpd -c "ErrorLog
/dev/stdout" -DFOREGROUND user=chrism
environment=HOME="/home/chrism",USER="chrism"
答案 1 :(得分:0)
您可以使用目录选项。
“当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
答案 2 :(得分:0)
不要忘记重新启动supervisord本身,例如/etc/init.d/supervisord restart
,因为否则您的配置更改将被取消,并且它将继续以root身份运行您的服务。