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 | 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启 |