supervisor-管理多个项目启动


目前项目需要启动的文件比较多, 有主进程main.py, 小进程PedestrianTrailGenerator.py, 定时celery任务, java spring-boot启动, 每个单独启动比较麻烦, 就使用supervisor管理这些需要启动的进程.

具体的supervisor详细配置内容, 可以参考官网http://supervisord.org/introduction.html, 或者这个总结链接:https://www.cnblogs.com/zhaoding/p/6257363.html

这里把本项目配置的操作记录一下:

下载

这里使用pip安装, 因为python运行时需要进入指定的虚拟环境, 所以可以把supervisor直接安装在虚拟环境下面, 但是这样启动supervisor前需要手动进入虚拟环境中, 这样不够偷懒, 所以这里把supervisor装在外部的环境中.由于本机用的是anaconda, shell连接后默认进入的是base环境, 这里我们把supervisor装在base环境中

pip install supervisor

设置配置文件

官方是把配置文件放到/etc目录下

echo_supervisord_conf > /etc/supervisord.conf

这里为了配置方便, 把配置文件放到了项目的根目录下

echo_supervisord_conf > /home/alex/project_root_path/supervisord.conf

配置文件中有很多默认配置, 这里我们只该我们需要的配置即可

配置supervisord

这里主要配置日志文件的路径, 为了查看方便, 依然设置的是在项目根目录下.

该日志文件记录的是spuervisor服务启动的日志, 不是具体自定义进程内部的日志

[supervisord]
logfile=/home/alex/project_root_path/supervisord.log ; main log file; default $CWD/supervisord.log

其他配置这里保持默认

配置program

python文件的运行如下:

[program:run_main]
command=/home/alex/anaconda3/envs/test_env/bin/python -u main.py
directory=/home/alex/project_root_path
stdout_logfile=supervisor_run_main.log        ; stdout log path, NONE for none; default AUTO
stderr_logfile=supervisor_run_main.log        ; stderr log path, NONE for none; default AUTO
  • program: 进程名称, 自定义
  • directory: 运行command前进入的目录, 当然也可以直接在command中指定目录
  • stdout_logfile: 记录进程内部运行后的print等日志
  • stderr_logfile: 同stdout_logfile一样, 只不过记录的是运行中的错误日志, 这里我把他们设置在了一个日志文件中
  • command: 进程运行的命令

celery文件的运行如下:

[program:run_celery]
command=/home/alex/anaconda3/envs/test_env/bin/celery -A tasks worker -B
directory=/home/alex/project_root_path
stdout_logfile=supervisor_run_celery.log        ; stdout log path, NONE for none; default AUTO
stderr_logfile=supervisor_run_celery.log        ; stderr log path, NONE for none; default AUTO

spring-boot的运行如下:

[program:run_hkapi]
command=mvn spring-boot:run
directory=/home/alex/pom.xml_path
stdout_logfile=supervisor_run_hkapi.log        ; stdout log path, NONE for none; default AUTO
stderr_logfile=supervisor_run_hkapi.log        ; stderr log path, NONE for none; default AUTO

遇到的问题

程序中的print()没有正常输出到日志文件中

百度查找说因为缓冲区的问题, 在python的执行命令中加入-u参数就可以了

设置python运行时的虚拟环境

因为前面把supervisor安装在了python运行时的虚拟环境外面, 因此在[program]中需要设置运行的虚拟环境.

首先尝试了在python语句前拼接conda启动环境的命令:

command=conda activate text_env&&python -u main.py

但是报错日志说:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'

看来是不能读取到conda activate命令

然后尝试了使用supervisor自带的environment属性, 例下等:

environment=PYTHONPATH="/home/alex/anaconda3/envs/test_env"
或者
environment=PYTHONPATH="/home/alex/anaconda3/envs/test_env/bin"
或者
environment=PYTHONPATH=$PYTHONPATH:/home/alex/anaconda3/envs/test_env

都没有生效, 还是在[program]中设置的日志中报错: 没有找到xxx模块

最后只能在command中写死虚拟环境的python解释器的路径, 这样也能实现虚拟环境中启动python文件

常用命令

命令 用途
supervisord 启动supervisor监管服务
supervisorctl start xxx 启动XXX进程
supervisorctl restart xxx 重启XXX进程
supervisorctl stop xxx 停止XXX进程
supervisorctl stop all 停止全部进程
supervisorctl status 查看supervisor监管的进程状态
supervisorctl reload 修改完配置文件后重新启动supervisor
supervisorctl update 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
posted @ 2021-04-17 09:22  Alex-GCX  阅读(1925)  评论(0编辑  收藏  举报