Назад | Перейти на главную страницу

Systemd вызывает несколько процессов супервизора

У меня возникла проблема с определением того, где проблема в конфигурации моего супервизора, которая вызывает дублирование программы.

Я запускаю веб-сервер Python Tornado через обратный прокси-сервер Nginx. Я думаю, что проблема больше связана с руководителем.

/etc/supervisor/supervisord.conf

[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor           
logfile_maxbytes=50MB                           
logfile_backups=5                               
loglevel=error                                  

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

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files = /etc/supervisor/conf.d/*.conf

/etc/supervisor/conf.d/tornado.conf

[program:tornado]
numprocs = 4
numprocs_start = 8000
process_name = %(program_name)s_%(process_num)02d
directory=/home/username/webapp
environment=PATH="/home/username/.virtualenvs/tornado_env/bin"
command = python server.py --port=%(process_num)s
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/webapp/%(program_name)s_%(process_num)02d.log
loglevel=info

Как вы видете numprocs = 4, но мое замешательство возникает из-за этого после перезапуска сервера.

ps -aux | egrep "руководитель | питон"

root       399  0.1  2.6  14496  9584 ?        Ss   15:48   0:03 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
www-data   410  0.1  3.9  16872 14200 ?        S    15:48   0:02 python server.py --port=8002
www-data   411  0.1  3.9  16872 14180 ?        S    15:48   0:02 python server.py --port=8003
www-data   412  0.1  3.9  16872 14124 ?        S    15:48   0:02 python server.py --port=8000
www-data   413  0.1  3.9  16872 14180 ?        S    15:48   0:02 python server.py --port=8001
www-data   489  0.0  3.0  16872 11024 ?        S    15:49   0:00 python server.py --port=8003
www-data   490  0.0  3.1  16872 11228 ?        S    15:49   0:00 python server.py --port=8000
www-data   491  0.0  3.1  16872 11244 ?        S    15:49   0:00 python server.py --port=8002
www-data   492  0.0  3.0  16872 11192 ?        S    15:49   0:00 python server.py --port=8001

Существует 8 процессов Python, но супервизор знает только о 4. Что еще мне нужно искать?

sudo supervisorctl статус

tornado:tornado_8000             RUNNING    pid 412, uptime 0:36:03
tornado:tornado_8001             RUNNING    pid 413, uptime 0:36:03
tornado:tornado_8002             RUNNING    pid 410, uptime 0:36:05
tornado:tornado_8003             RUNNING    pid 411, uptime 0:36:04

ОБНОВИТЬ: Как-то работает supervisor и systemd порождает повторяющуюся конфигурацию. Итак, теперь мой вопрос: отключить supervisor service, и если да, то что еще вызывает его запуск?

sudo systemctl status supervisor

● supervisor.service - LSB: Start/stop supervisor
   Loaded: loaded (/etc/init.d/supervisor)
   Active: active (running) since Wed 2015-12-23 15:48:45 CST; 1h 31min ago
  Process: 305 ExecStart=/etc/init.d/supervisor start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/supervisor.service
           ├─399 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
           ├─489 python server.py --port=8003
           ├─490 python server.py --port=8000
           ├─491 python server.py --port=8002
           └─492 python server.py --port=8001

После дальнейшего расследования проблема была на самом деле моим сервером Python Tornado. Он разветвлял один процесс для каждого процессора, что сбивает меня с толку на одноядерном Raspberry Pi, но неважно.

Итак, вывод приведенных выше команд действителен; нет никаких "дубликатов" от супервизора или Systemd. Проблема была больше связана с управлением жизненным циклом этих процессов супервизором, то есть запуском, остановкой, перезагрузкой.

Когда я останавливал его раньше, разветвленные процессы оставались активными, поэтому, когда я перехожу к перезапуску супервизора, я получаю в общей сложности 4 + 8 = 12 процессов.

Исправление заключалось в том, чтобы добавить эту строку в мой /etc/supervisor/conf.d/tornado.conf.

stopasgroup=true

Для которого документация читает

Если true, флаг заставляет супервизор отправить сигнал остановки всей группе процессов и подразумевает killasgroup правда. Это полезно для программ, таких как Flask в режиме отладки, которые не передают сигналы остановки своим дочерним элементам, оставляя их сиротами.