39

主管在 3.0 上运行:

pip freeze | grep supervisor
supervisor==3.0

从命令行启动 supervisord 时:

sudo $VIRTENV/supervisord --nodaemon --configuration $PATH_TO_CONFIG/supervisord.conf

我收到此错误:

2013-11-11 23:30:50,205 CRIT Supervisor running as root (no user in config file)

但是没有sudo我无法启动 supervisord ,它抱怨:

Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)

处理它的正确方法是什么?

(如果以 root 身份启动但在 supervisord.conf 的 [supervisord] 部分下设置 user = foobar,我会得到同样的错误)

更新:这是我的 supervisord.conf

[unix_http_server]
file = /opt/run/supervisord.sock

[inet_http_server]
port = 9001
username = foobar
password = foobar

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisord]
logfile = /opt/logs/supervisord.log
loglevel = debug
pidfile = /opt/run/supervisord.pid

[supervisorctl]

[program:foo1]
user = foobar
autostart = True
autorestart = True
command = foo1
stdout_logfile = /opt/logs/foo1.stdout.log
stderr_logfile = /opt/logs/foo1.stderr.log
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB

[program:foo2]
user = foobar
autostart = true
autorestart = true
command = foo2
priority = 100
stdout_logfile_backups = 0
stderr_logfile_backups = 0
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB
stdout_logfile = /opt/logs/foo2.stdout.log
stderr_logfile = /opt/logs/foo2.stderr.log
4

5 回答 5

28

Supervisord 在任何处理之前切换到 UNIX 用户帐户。

您需要指定它应该使用哪种用户帐户,以 root 身份运行守护程序,但在配置文件中指定用户

例子:

[program:myprogram]
command=gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker app.wsgi:application -b 127.0.0.1:8000
directory=/opt/myprogram
user=user1
autostart=true
autorestart=true
redirect_stderr=True

访问http://supervisord.org/configuration.html#program-x-section-values了解更多信息

于 2013-11-11T23:44:22.883 回答
14

当您以 root 身份启动 supervisor 时,出于安全原因,您需要为 supervisor 指定一个用户

来自主管文档(http://supervisord.org/configuration.html):

user
If supervisord is run as the root user, switch users to this UNIX user account before doing any meaningful processing. 
This value has no effect if supervisord is not run as root.

把它放在你的 conf 文件中:

[supervisord]
user=nobody

用户应该是存在的用户,但没有 sudo 权限(没有人可以工作)。

于 2014-02-26T17:13:19.930 回答
12

你得到了:

根据我的理解,您收到了这条令您困扰的 CRIT 消息:

CRIT Supervisor 以 root 身份运行(配置文件中没有用户)

括号中的词是一个线索。此消息表明您可能无意中以 root 身份运行 Supervisor 。

做这个:

所以解决方案很简单:告诉主管你是故意这样做的。
(在/etc/supervisor/supervisord.conf

[supervisord]
user = root

以 root 身份运行 Supervisord 后,它会将 uid 设置为您分配的用户,即 root。(#308

不重要:

虽然现在您可能会收到此消息:

CRIT 将 uid 设置为用户 0

不用担心,此消息应该是 INFO 级别而不是 CRIT 级别。(#693

于 2017-11-30T05:55:22.613 回答
12

对我来说,我在以非 root 用户身份运行时收到此错误:

Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)

在我将保存 sock 文件的目录分配给该用户后,这种情况就消失了。

在你的情况下:

[unix_http_server]
file = /opt/run/supervisord.sock

要么chown username /opt/run/,要么 将文件指向用户拥有的另一个目录。

我从这个链接学到了这种方法。


此外,我的系统管理员安装了我编写的 init.d 脚本。init.d 脚本以 root 身份运行,但脚本可以让 supervisordmyuser使用以下命令启动:

SUPERVISORD=/path/to/supervisord
PIDFILE=/path/to/supervisord.pid
OPTIONS='-c /path/to/supervisord.conf'
daemon --pidfile=$PIDFILE --user=myuser $SUPERVISORD $OPTIONS
于 2016-01-20T00:56:59.870 回答
1

我的环境:

宅基地+laravel ubuntu18 LTS

我有同样的问题,
一定要控制文件属于正确的所有者。

1.启动supervisor必须使用root

例子:

vagrant@homestead:~$ sudo supervisord -c /etc/supervisord.conf
vagrant@homestead:~$ ps -aux|grep supervisord
root     12145  0.0  0.8  71144 16744 ?        Ss   07:20   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf

您可以终止主管的所有处理并重新运行

2.尽量不要使用root运行作业。

我的工作是/etc/supervisor/conf.d/lara*.conf,用户是流浪汉

我的工作会议

chown日志文件到vagrant与supervisor.conf相关的invole文件

我的主管会议

然后

运行supervisorctl status使用vagrant

作业运行

于 2020-09-10T07:57:58.333 回答