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 根據最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啟


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM