我在缩小导致程序重复的主管配置问题的范围时遇到了问题。
我正在通过 Nginx 反向代理运行 Python Tornado Web 服务器。不过我认为问题更多地与主管有关。
/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 “supervisor|python”
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 进程,但 Supervisor 只知道其中 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
服务,如果是,那么还有什么原因导致它启动?
sudo systemctl 状态主管
● 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
答案1
经过进一步调查,问题实际上出在我的 Python Tornado Server 上。它在每个 CPU 上分叉一个进程,这让我在单核 Raspberry Pi 上感到困惑,但无论如何。
因此,上述命令的输出是有效的;不存在来自主管或 Systemd 的“重复”。问题更多地与主管对这些进程的生命周期管理有关,即启动、停止、重新加载。
当我之前停止它时,分叉的进程将保持活动状态,因此当我重新启动主管时,我将获得总共 4 + 8 = 12 个进程。
解决方法是将此行添加到我的/etc/supervisor/conf.d/tornado.conf
。
stopasgroup=true
为此文档读
如果为真,该标志会导致主管向整个进程组发送停止信号,并暗示
killasgroup
为真。这对于不向子进程传播停止信号的程序(如处于调试模式的 Flask)很有用,这些程序会使子进程处于孤立状态。