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




unix_http_server ini (5)

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

Супервизор работает на 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)

Но я не могу начать супервизор без судо , он жалуется:

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

Ты получил:

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

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

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

Сделай это:

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

[supervisord]
user = root

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

Не важно:

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

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

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


Для меня я получил эту ошибку во время работы как пользователь без полномочий root:

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

Это ушло после того, как я отправил каталогу, в котором хранятся файлы-носки для этого пользователя.

В твоем случае:

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

Либо chown username /opt/run/ , либо укажите файл в другой каталог, который принадлежит пользователю.

Я изучил этот подход по этой link .

Кроме того, мои системные администраторы установили сценарий init.d, который я написал. Сценарий init.d запускается с правами root, но скрипт может получить супервизор для запуска в myuser с помощью этой команды:

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

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


Да, это можно сделать в одну строку.

>>> re.sub(r"\b(this|string)\b", r"<markup>\1</markup>", "this is my string")
'<markup>this</markup> is my <markup>string</markup>'

\b гарантирует, что сопоставляются только полные слова.

Поэтому, если у вас есть список слов, которые вы хотите отметить, вы можете сделать следующее:

>>> mywords = ["this", "string", "words"]
>>> myre = r"\b(" + "|".join(mywords) + r")\b"
>>> re.sub(myre, r"<markup>\1</markup>", "this is my string with many words!")
'<markup>this</markup> is my <markup>string</markup> with many <markup>words</markup>!'




python startup supervisord