Python中如何使用supervisor管理多个服务

现在有两个服务,如果全部让 supervisor 去管理的话,配置文件该怎么写呢,直接写两个 program:x 吗?这样试过了,用 ps 可以找到这两个服务的进程,可是服务 2 是不可用的,服务 1 正常。


Python中如何使用supervisor管理多个服务
20 回复

服务 2 直接启动呢


用supervisor管理多个服务,主要就是配置一个配置文件。下面是一个完整的示例,假设我们要同时管理一个Flask应用和一个Celery worker。

首先,确保安装了supervisor:

pip install supervisor

然后,创建一个配置文件,比如叫 my_supervisor.conf。关键是把多个 [program:x] 部分写进去。

; supervisor配置文件 - my_supervisor.conf
[unix_http_server]
file=/tmp/supervisor.sock   ; supervisor监听的socket文件路径

[supervisord]
logfile=/tmp/supervisord.log ; 主进程日志文件
logfile_maxbytes=50MB        ; 日志文件最大大小
logfile_backups=10           ; 日志备份数量
loglevel=info                ; 日志级别
pidfile=/tmp/supervisord.pid ; pid文件路径
nodaemon=false               ; 是否以守护进程方式运行
minfds=1024                  ; 最小文件描述符
minprocs=200                 ; 最小进程数

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

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 通过socket连接

; 定义第一个服务:一个Flask Web应用
[program:my_flask_app]
command=/path/to/your/venv/bin/python /path/to/your/app.py ; 启动命令,务必用绝对路径
directory=/path/to/your/app_dir ; 程序运行的工作目录
autostart=true ; 是否随supervisor启动而自动启动
autorestart=true ; 程序退出后是否自动重启
startretries=3 ; 启动失败后的重试次数
stderr_logfile=/var/log/my_flask_app_err.log ; 标准错误日志
stdout_logfile=/var/log/my_flask_app_out.log ; 标准输出日志
user=your_username ; 以哪个用户身份运行(可选)
environment=PYTHONPATH="/path/to/your/project",PORT="5000" ; 设置环境变量

; 定义第二个服务:一个Celery Worker
[program:my_celery_worker]
command=/path/to/your/venv/bin/celery -A your_celery_app worker --loglevel=info
directory=/path/to/your/celery_dir
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/celery_worker_err.log
stdout_logfile=/var/log/celery_worker_out.log
; 可以继续添加更多 [program:x] 部分来管理其他服务

如何使用这个配置:

  1. 启动supervisor:用 -c 指定你的配置文件。
    supervisord -c my_supervisor.conf
    
  2. 管理服务:使用 supervisorctl 命令。先进入交互模式,或者直接在命令行操作。
    • 进入交互控制台:
      supervisorctl -c my_supervisor.conf
      
    • 在控制台内或命令行,你可以:
      • status:查看所有程序状态。
      • start my_flask_app:启动Flask应用。
      • stop my_celery_worker:停止Celery worker。
      • restart all:重启所有程序。
      • reread & update:修改配置文件后,重新加载配置。

核心要点:

  • 每个服务就是一个 [program:你的服务名] 区块。
  • command 必须用绝对路径,这是最容易出错的地方。
  • 通过 autostartautorestart 实现自动管理。
  • 日志文件路径要确保有写入权限。

总结:配好文件,一个supervisord进程就能管起所有服务。

根据我的实测经验,要不你配置写错,要不你代码写错,supervisor 是支持多个服务的,就是写两个[program:x]类似的 section

#1 直接启动是可以的,服务 2 直接用 gunicorn 启动也可以,配置两个 program 后启动,刚开始服务 2 是可以用的,过一会就不行了,服务 1 始终正常

#2 对的,他确实支持,我也刚不懂为啥了,要挂一起挂还能理解,挂一个留一个费解啊

#1
#2
我在两个 program 中都配置了 stopsignal=TERM 不影响吧

strace 调试试试

不影响TERM是默认值

#6 好的,我试下

用 supervisorctl status 看看状态,有启动问题可以去看相关的 log

#9 状态 running,ps aux 能查到进程,在启动的大概 30 分内可以正常访问,之后就不能正常访问,可是进程还在

[include]
files = /Users/lee/Programs/supvervisor/conf.d/*.conf
一个服务一个文件,应该是配置文件写错了。

我同意 9 楼的说法,看日志,看看是为什么退出

supervisor 的配置文件里最底部,不是有个
;[include]
;files = relative/directory/.ini
前面分号去掉,改成:
[include]
files = /etc/supervisord.d/
.conf

没有 /etc/supervisord.d/文件夹就自己新建一个
然后在 /etc/supervisord.d/文件夹下任意新建服务配置文件

那就去看应用的 log 有没有异常吧
感觉是应用的问题和 supervisor 没关系

#14 恩恩,我再去试下单独跑应用

#13 我是直接 echo_supervisord_conf 这个命令生成一份 myapp.conf,然后在这个配置文件中配了两个 program,启动:sudo supervisord -c myapp.conf, 然后这两个服务启动,但二三十分钟之后服务二不可用

supervisor 添加配置之后必须进行 reread 和 updte 操作,不然无效,好像重启也没用

看日志,进城还在,但是服务不能用,确定一下是不是你服务本身有问题

端口冲突?

回到顶部