程序部分中的Supervisor配置用户选项

问题描述 投票:10回答:3

我有一个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用户?

tornado supervisord supervisor
3个回答
19
投票

我已经解决了这个问题:

在程序部分添加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"

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

0
投票

不要忘记重新启动supervisord本身,例如/etc/init.d/supervisord restart,因为否则你的conf更改没有被提取,它将继续以root身份运行你的服务。

© www.soinside.com 2019 - 2024. All rights reserved.