Démarrer supervisord en tant que root ou pas?

Superviseur est en cours d'exécution sur 3.0:

pip freeze | grep supervisor
supervisor==3.0

en démarrant supervisord à partir de la ligne de commande:

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

j'ai cette erreur:

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

Mais je ne peux pas commencer à supervisord sans sudo, il se plaint:

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

Quelle est la bonne façon d'y faire face?

(j'obtiens la même erreur si je la démarre en root mais en définissant user = foobar sous la section [supervisord] dans supervisord.conf)

mise à Jour: Voici mon superviseur.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
28
demandé sur kev 2013-11-12 03:39:04

4 réponses

Supervisord passe au compte utilisateur UNIX avant tout traitement.

vous devez spécifier le type de compte utilisateur qu'il doit utiliser, lancer le démon en tant que root mais spécifier l'utilisateur dans le fichier de configuration

Exemple:

[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

Visite http://supervisord.org/configuration.html#program-x-section-values pour plus d'information

23
répondu Jan Vorcak 2013-11-11 23:49:53

Lorsque vous démarrez superviseur en tant que root, vous devez spécifier un superviseur de l'utilisateur de tomber pour des raisons de sécurité

du superviseur docs (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.

Mettez ceci dans votre fichier conf:

[supervisord]
user=nobody

l'utilisateur doit être un utilisateur qui existe, mais qui n'a pas les permissions sudo (personne ne peut travailler).

11
répondu Rylan 2014-02-26 17:13:19

Pour moi, j'ai reçu ce message d'erreur lors de l'exécution comme un utilisateur non-root:

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

Ceci est parti après que j'ai jeté le répertoire contenant le fichier sock à cet utilisateur.

dans votre cas:

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

chown username /opt/run/, ou pointer le fichier vers un autre répertoire qui est la propriété de l'utilisateur.

j'ai appris cette approche à partir de ce lien.


de plus, mes administrateurs ont installé un init.d script que j'ai écrit. Le initialisation.d script est lancé en tant que root, mais le script peut faire démarrer supervisord sur myuser avec cette commande:

SUPERVISORD=/path/to/supervisord
PIDFILE=/path/to/supervisord.pid
OPTIONS='-c /path/to/supervisord.conf'
daemon --pidfile=$PIDFILE --user=myuser $SUPERVISORD $OPTIONS
8
répondu Matthew Moisen 2016-01-25 19:22:24

Vous avez:

D'après ce que j'ai compris, vous avez reçu ce message D'hématocrite qui vous tracasse:

CRIT Superviseur de l'exécution en tant que root (pas d'utilisateur dans le fichier de config)

Les mots entre parenthèses est un indice. Ce message indique que vous pouvez exécuter Supervisor comme root involontairement.

Faire ceci:

Donc la solution est assez simple: Dites au Superviseur que vous faites cela intentionnellement.

/etc/supervisor/supervisord.conf)

[supervisord]
user = root

une fois que vous exécutez Supervisord en tant que root, il configure uid pour l'utilisateur que vous avez assigné, qui est root. (#308)

pas important:

Bien que maintenant vous pouvez obtenir ce message:

CRIT Set uid to user 0

pas de soucis, ce message devrait être un niveau INFO plutôt qu'un niveau CRIT. ( #693)

3
répondu Kyan 2017-11-30 05:55:22