1、簡介
supervisor是python開發的一個程式管理工具,可以將一個普通的命令列程式變為後臺的守護程式,並且監控程式的執行狀態,如果因為異常退出的時候會自動重啟。它是通過fork/exec的方式把這些被管理的程式當作supervisor的子程式來啟動,這樣只要在supervisor的配置檔案中,把要管理的程式的可執行檔案的路徑寫進去即可。也實現當子程式掛掉的時候,父程式可以準確獲取子程式掛掉的資訊的,可以選擇是否自己啟動和報警。supervisor還提供了一個功能,可以為supervisord或者每個子程式,設定一個非root的user,這個user就可以管理它對應的程式。
- supervisord
執行superior的時候會啟動一個程式superiord,他主要是負責啟動所管理的程式,並且將所管理的程式作為自己的子程式來啟動,而且可以在所管理的程式出現崩潰的時候自動重啟
- supervisorctl
它是supervisor的命令列管理工具,可以執行stop
,start
,restart
,status
,update
等指令,來對這些子程式進行管理。
supervisor是所有程式的父程式,管理所有的子程式,supervisor以子程式的PID來管理子程式,當子程式異常退出的時候supervisor可以收到相應的訊號量
2、安裝supervisor
因為supervisor是基於python來執行的,所以我們的伺服器上必須有python環境,但是如果你伺服器上跑的是django或者其他的python專案必然基於python環境,如果supervisor管理的後臺服務比較多的話肯定會有一些影響,所以supervisor的安裝會建立一個新的虛擬環境。
1、安裝Python3.8.2
# 下載python
> wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
# 解壓安裝包
> tar -xf Python-3.8.2.tar.xz
# 進入目標檔案
> cd Python-3.8.2
# 配置安裝目錄
> ./configure --prefix=/usr/local/python3
# 編譯&安裝
> make && sudo make install
# 建立軟連線:python3,pip3
> ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
> ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip3
# 刪除安裝包與檔案
> rm -rf Python-3.8.2
> rm -rf Python-3.8.2.tar.xz
2、安裝python虛擬環境
# 1、安裝工具包
> pip3 install virtualenv
> pip3 install virtualenvwrapper
# 注意:有些直譯器無法直接安裝virtualenvwrapper包,可能是因為缺少依賴,可以先安裝一下下面兩個包
> pip3 install pbr
> pip3 install stevedore
# 2、建立虛擬環境軟連結
> ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
# 3、配置虛擬環境對應環境變數
> vim ~/.bash_profile
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
# 指定virtualenv的路徑
source /usr/local/bin/virtualenvwrapper.sh
# 4、更新配置檔案內容
> source ~/.bash_profile
所有的虛擬環境檔案都指定存放在~/.virtualenvs 目錄
3、建立python虛擬環境
# 1、建立虛擬環境
> mkvirtualenv supervisor_env # 虛擬環境名稱
# 2、管理虛擬環境
> workon # 進入虛擬環境只需要在後面加上虛擬環境名稱
# 3、退出虛擬環境
> deactivate
4、supervisor安裝
# 安裝
> pip install supervisor
# 生成配置檔案
> echo_supervisord_conf > supervisord.conf
3、配置supervisor
5、superiord.conf
# 指定socket檔案路徑
[unix_http_server]
file=/root/work/manager/supervisor/supervisor.sock ; the path to the socket file
[supervisord]
logfile=/root/work/manager/supervisor/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/root/work/manager/supervisor/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
silent=false ; no logs to stdout if true; default false
minfds=1024 ; min. avail startup file descriptors; default 1024
minprocs=200 ; min. avail process descriptors;default 200
[supervisorctl]
serverurl=unix:///root/work/manager/supervisor/supervisor.sock ; use a unix:// URL for a unix socket
# 指定分發所有子程式的配置目錄,預設子程式配置檔案為ini格式
[include]
files = conf.d/*.ini
6、例:conf.d/onlydaya.ini
將不同分類的子程式單獨使用配置檔案,便於後期管理。下面的例子是後臺啟動uwsgi
# 專案名稱
[program:onlydata]
# 指令碼目錄
directory=/root/work/code/python/onlydata
# 指令碼執行命令
command=/root/.virtualenvs/onlydata/bin/uwsgi --ini /root/work/code/python/onlydata/onlydata/uwsgi.ini
# 日誌輸出
stderr_logfile=/root/work/code/python/onlydata/uwsgi.err.log
stdout_logfile=/root/work/code/python/onlydata/uwsgi.out.log
# 指令碼執行的使用者身份
user=root
stopsignal=INT
# 這個選項是子程式啟動多少秒之後,此時狀態如果是running,則我們認為啟動成功了。預設值為1
startsecs=1
4、supervisor常用命令
supervisorctl status //檢視所有程式的狀態
supervisorctl stop es //停止es
supervisorctl start es //啟動es
supervisorctl restart //重啟es
supervisorctl update //配置檔案修改後使用該命令載入新的配置
supervisorctl reload //重新啟動配置中的所有程式
也可以通過supervisorctl
進入supervisor的shell介面,直接進行命令操作
補充:
systemctl start supervisord.service //啟動supervisor並載入預設配置檔案
systemctl enable supervisord.service //將supervisor加入開機啟動項