Подтвердить что ты не робот

Запуск супервизора как root или нет?

Супервизор работает в версии 3.0:

pip freeze | grep supervisor
supervisor==3.0

При запуске супервизора из командной строки:

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, он жалуется:

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

Каков правильный способ справиться с этим?

(Я получаю ту же ошибку, если ее запускают как root, но устанавливаю user = foobar в разделе [supervisord] в файле supervisord.conf)

Обновление: Вот мой 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
4b9b3361

Ответ 1

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 для получения дополнительной информации

Ответ 2

Когда вы начинаете супервизор с правами root, вам нужно указать, чтобы пользователь для супервизора отказался по соображениям безопасности

Из документов диспетчера (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 (никто не может работать).

Ответ 3

Для меня я получил эту ошибку при запуске как пользователь без полномочий 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 script, я написал. Init.d script запускается с правами root, но script может получить супервизор, чтобы начать с myuser с помощью этой команды:

SUPERVISORD=/path/to/supervisord
PIDFILE=/path/to/supervisord.pid
OPTIONS='-c /path/to/supervisord.conf'
daemon --pidfile=$PIDFILE --user=myuser $SUPERVISORD $OPTIONS

Ответ 4

Вы получили:

В моем понимании вы получили это сообщение CRIT, которое вас беспокоит:

Контроллер CRIT работает под управлением root (нет пользователя в файле конфигурации)

Слова в скобках - это ключ. Это сообщение указывает, что вы можете запускать Supervisor как root непреднамеренно.

Сделайте это:

Итак, решение довольно просто: сообщите супервизору, что вы это намеренно делаете.
/etc/supervisor/supervisord.conf)

[supervisord]
user = root

Как только вы запускаете Supervisord как root, он устанавливает uid назначаемому пользователю, который является root. (# 308)

Не важно:

Хотя теперь вы можете получить это сообщение:

CRIT Установите uid пользователю 0

Не беспокойтесь, это сообщение должно быть уровнем INFO, а не уровнем CRIT.  (# 693)