程序部分中监控配置用户选项

20

我有一个Tornado程序,并且所有相关的Python库都安装在名为Bob的非root用户中:

pip install --user xxx

现在我想在supervisor中运行它:

[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 status 中失败了:

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是做什么的?如何在选项中配置运行用户?

3个回答

40

我已经解决了这个问题:

在程序部分添加environment选项:

environment=HOME="/home/bob",USER="bob"

参见Supervisor文档-子进程环境:

当supervisord运行子进程时,不会执行任何shell,因此环境变量(如USER、PATH、HOME、SHELL、LOGNAME等)不会从它们的默认值更改或重新分配。这一点尤其重要,当您以配置中user=选项定义的用户身份在root下运行supervisord时。与cron不同,当supervisord执行setuid到user=程序配置选项中定义的用户时,它不会尝试推断和覆盖“基本”的环境变量,如USER、PATH、HOME和LOGNAME。如果您需要为某个特定程序设置环境变量,可能会被shell调用为特定用户设置,则必须明确地在environment=程序配置选项内进行设置。下面是设置这些环境变量的示例。

[program:apache2]
command=/home/chrism/bin/httpd -c "ErrorLog
/dev/stdout" -DFOREGROUND user=chrism
environment=HOME="/home/chrism",USER="chrism"

3
请注意,如果您正在运行一个 [fcgi-program:foo],您可能需要将套接字的用户设置为 _www-data_。以下是有效的设置方式: [fcgi-program:foo] user=www-data environment=USER="www-data" # 其余选项 - uKolka

2
你可以使用目录选项。
“当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

我想知道在编程中,set usersudo -u bob之间的区别是什么? - Tanky Woo
嗨,我已经解决了这个问题,你可以看看我的答案。 - Tanky Woo

-1

别忘了重启 supervisord 本身,例如使用 /etc/init.d/supervisord restart 命令,否则您的配置更改将不会被捕获,它将继续以 root 用户身份运行您的服务。


4
您无需重启supervisord本身。可以使用supervisorctl update命令重新加载配置并重新启动受影响的程序或组,或者使用supervisorctl reread仅更新配置,然后根据需要有选择性地重启服务。即使通过init脚本重启进程,在这种情况下使用supervisorctl reload命令也比较好,因为后者可以确保在supervisor守护进程重新启动之前正确关闭进程。 - Martijn Pieters
最后但并非最不重要的,这只是一个额外的评论,它并没有解决问题本身。 - Martijn Pieters

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