目前項目需要啟動的文件比較多, 有主進程
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 | 根據最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啟 |