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
1、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
2、例: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
3、配置文件詳解
- command:啟動程序使用的命令,可以是絕對路徑或者相對路徑
- process_name:一個python字符串表達式,用來表示supervisor進程啟動的這個的名稱,默認值是%(program_name)s
- numprocs:Supervisor啟動這個程序的多個實例,如果numprocs>1,則process_name的表達式必須包含%(process_num)s,默認是1
- numprocs_start:一個int偏移值,當啟動實例的時候用來計算numprocs的值
- priority:權重,可以控制程序啟動和關閉時的順序,權重越低:越早啟動,越晚關閉。默認值是999
- autostart:如果設置為true,當supervisord啟動的時候,進程會自動重啟。
- autorestart:值可以是false、true、unexpected。false:進程不會自動重啟,unexpected:當程序退出時的退出碼不是exitcodes中定義的時,進程會重啟,true:進程會無條件重啟當退出的時候。
- startsecs:程序啟動后等待多長時間后才認為程序啟動成功
- startretries:supervisord嘗試啟動一個程序時嘗試的次數。默認是3
- exitcodes:一個預期的退出返回碼,默認是0,2。
- stopsignal:當收到stop請求的時候,發送信號給程序,默認是TERM信號,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
- stopwaitsecs:在操作系統給supervisord發送SIGCHILD信號時等待的時間
- stopasgroup:如果設置為true,則會使supervisor發送停止信號到整個進程組
- killasgroup:如果設置為true,則在給程序發送SIGKILL信號的時候,會發送到整個進程組,它的子進程也會受到影響。
- user:如果supervisord以root運行,則會使用這個設置用戶啟動子程序
- redirect_stderr:如果設置為true,進程則會把標准錯誤輸出到supervisord后台的標准輸出文件描述符。
- stdout_logfile:把進程的標准輸出寫入文件中,如果stdout_logfile沒有設置或者設置為AUTO,則supervisor會自動選擇一個文件位置。
- stdout_logfile_maxbytes:標准輸出log文件達到多少后自動進行輪轉,單位是KB、MB、GB。如果設置為0則表示不限制日志文件大小
- stdout_logfile_backups:標准輸出日志輪轉備份的數量,默認是10,如果設置為0,則不備份
- stdout_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位可以是KB、MB、GB
- stdout_events_enabled:如果設置為true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
- stderr_logfile:把進程的錯誤日志輸出一個文件中,除非redirect_stderr參數被設置為true
- stderr_logfile_maxbytes:錯誤log文件達到多少后自動進行輪轉,單位是KB、MB、GB。如果設置為0則表示不限制日志文件大小
- stderr_logfile_backups:錯誤日志輪轉備份的數量,默認是10,如果設置為0,則不備份
- stderr_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位可以是KB、MB、GB
- stderr_events_enabled:如果設置為true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
- environment:一個k/v對的list列表
- directory:supervisord在生成子進程的時候會切換到該目錄
- umask:設置進程的umask
- serverurl:是否允許子進程和內部的HTTP服務通訊,如果設置為AUTO,supervisor會自動的構造一個url
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加入開機啟動項
啟動supervisor之后就可以通過ip:9001
訪問supervisor的管理頁面