網站首頁 編程語言 正文
supervisor介紹
首先,介紹一下supervisor。Supervisor(http://supervisord.org)是用Python開發的一個client/server服務,是Linux/Unix系統下的一個進程管理工具,不支持Windows系統。它可以很方便的監聽、啟動、停止、重啟一個或多個進程。用Supervisor管理的進程,當一個進程意外被殺死,supervisort監聽到進程死后,會自動將它重新拉起,很方便的做到進程自動恢復的功能,不再需要自己寫shell腳本來控制
環境:centos7.4
安裝supervisor
pip install supervisor
因為是python開發的一個庫,可以直接用pip來安裝,很方便。
supervisor安裝完成后會生成三個執行程序:supervisortd、supervisorctl、echo_supervisord_conf,分別是supervisor的守護進程服務(用于接收進程管理命令)、客戶端(用于和守護進程通信,發送管理進程的指令)、生成初始配置文件程序。
設置環境變量
$ vim ~/.bash_profile #在后面補充: PATH=$PATH:$HOME/bin:/usr/local/python/bin $ source ~/.bash_profile
配置supervisor
創建目錄,初始化配置文件
mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf
主配置文件參數
[unix_http_server] file=/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 會使用 ;chmod=0700 ; socket 文件的 mode,默認是 0700 ;chown=nobody:nogroup ; socket 文件的 owner,格式: uid:gid ;[inet_http_server] ; HTTP 服務器,提供 web 管理界面 ;port=127.0.0.1:9001 ; Web 管理后臺運行的 IP 和端口,如果開放到公網,需要注意安全性 ;username=user ; 登錄管理后臺的用戶名 ;password=123 ; 登錄管理后臺的密碼 [supervisord] logfile=/tmp/supervisord.log ; 日志文件,默認是 $CWD/supervisord.log logfile_maxbytes=50MB ; 日志文件大小,超出會 rotate,默認 50MB logfile_backups=10 ; 日志文件保留備份數量默認 10 loglevel=info ; 日志級別,默認 info,其它: debug,warn,trace pidfile=/tmp/supervisord.pid ; pid 文件 nodaemon=false ; 是否在前臺啟動,默認是 false,即以 daemon 的方式啟動 minfds=1024 ; 可以打開的文件描述符的最小值,默認 1024 minprocs=200 ; 可以打開的進程數的最小值,默認 200 ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; 通過 UNIX socket 連接 supervisord,路徑與 unix_http_server 部分的 file 一致 ;serverurl=http://127.0.0.1:9001 ; 通過 HTTP 的方式連接 supervisord ; 包含其他的配置文件 [include] files = relative/directory/*.ini ; 可以是 *.conf 或 *.ini
管理一個進程
把所有被管理的進程配置文件都放在同一個目錄,主配置文件包含進去。
mkdir /etc/supervisor/config.d
vim /etc/supervisor/supervisord.conf [include] files = /etc/supervisor/config.d/*.conf
新建一個配置文件
[program:sougou] #souogu 為程序的名稱 command=scrapy crawl sougou #需要執行的命令 directory=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders #命令執行的目錄 environment=ASPNETCORE__ENVIRONMENT=Production #環境變量 user=root #用戶 stopsignal=INT autostart=true #是否自啟動 autorestart=true #是否自動重啟 startsecs=3 #自動重啟時間間隔(s) stderr_logfile=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders/ossoffical.err.log #錯誤日志文件 stdout_logfile=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders/ossoffical.out.log #輸出日志文件
[program:nginx] command = /usr/local/nginx/sbin/nginx -g 'daemon off;' startsecs = 3 autostart = true autorestart = true user = root stdout_logfile = /etc/supervisor/logs/supervisord-nginx.log stderr_logfile = /etc/supervisor/logs/supervisord-nginx-error.log
剛開始有個坑,command = /usr/local/nginx/sbin/nginx 我是這樣寫的 結果就一直啟動nginx 因為這樣的話 是后臺運行的nginx,然而supervisor 不能管理后臺運行進程,所以把nginx daemon off 守護關掉,就讓他阻塞在前臺bash運行,方便supervisor來管理。
supervisor配置文件詳解
- 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
啟動supervisor
supervisord -c /etc/supervisor/supervisord.conf
有時候kill進程之后需要釋放連接
unlink /tmp/supervisor.sock
web界面管理 開啟web訪問
vi /etc/supervisor/supervisord.conf [inet_http_server] port=0.0.0.0:9001 username=user password=123
此處需要注意將 [inet_http_server] 前邊的注釋也要去掉
supervisorctl的用法
- supervisord : 啟動supervisor
- supervisorctl reload :修改完配置文件后重新啟動supervisor
- supervisorctl status :查看supervisor監管的進程狀態
- supervisorctl start 進程名 :啟動XXX進程
- supervisorctl stop 進程名 :停止XXX進程
- supervisorctl stop all:停止全部進程,注:start、restart、stop都不會載入最新的配置文件。
- supervisorctl update:根據最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啟
superlance介紹
superlance就是基于supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor本身沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。同樣的,superlance本身也是使用python編寫的
superlance的組件
superlance是一系列命令行工具的集合,其包括以下這些命令:
- httpok 通過定時對一個HTTP接口進行GET請求,根據請求是否成功來判定一個進程是否處于正常狀態,如果不正常則對進程進行重啟。
- crashmail 當一個進程意外退出時,發送郵件告警。
- memmon 當一個進程的內存占用超過了設定閾值時,發送郵件告警。
- crashmailbatch 類似于crashmail的告警,但是一段時間內的郵件將會被合成起來發送,以避免郵件轟炸。
- fatalmailbatch 當一個進程沒有成功啟動多次后會進入FATAL狀態,此時發送郵件告警。與crashmailbatch一樣會進行合成報警。
- crashsms 當一個進程意外退出時發送短信告警,這個短信也是通過email網關來發送的。
1、當supervisord啟動的時候,如果我們的listener配置為autostart=true的話,listener就會作為supervisor的子進程被啟動。
2、listener被啟動之后,會向自己的stdout寫一個"READY"的消息,此時父進程也就是supervisord讀取到這條消息后,會認為listener處于就緒狀態。
3、listener處于就緒狀態后,當supervisord產生的event在listener的配置的可接受的events中時,supervisord就會把該event發送給該listener。
4、listener接收到event后,我們就可以根據event的head,body里面的數據,做一系列的處理了。我們根據event的內容,判斷,提取,報警等等操作。
5、該干的活都干完之后,listener需要向自己的stdout寫一個消息"RESULTnOK",supervisord接受到這條消息后。就知道listener處理event完畢了。
Supervisord支持的Event
- PROCESS_STATE 進程狀態發生改變
- PROCESS_STATE_STARTING
- 進程狀態從其他狀態轉換為正在啟動(Supervisord的配置項中有startsecs配置項,
- 是指程序啟動時需要程序至少穩定運行x秒才認為程序運行正常,在這x秒中程序狀態為正在啟動)
- PROCESS_STATE_RUNNING 進程狀態由正在啟動轉換為正在運行
- PROCESS_STATE_BACKOFF 進程狀態由正在啟動轉換為失敗
- PROCESS_STATE_STOPPING 進程狀態由正在運行轉換為正在停止
- PROCESS_STATE_EXITED 進程狀態由正在運行轉換為退出
- PROCESS_STATE_STOPPED進程狀態由正在停止轉換為已經停止(exited和stopped的區別是exited是程序自行退出,而stopped為人為控制其退出)
- PROCESS_STATE_FATAL 進程狀態由正在運行轉換為失敗
- PROCESS_STATE_UNKNOWN 未知的進程狀態
- REMOTE_COMMUNICATION 使用Supervisord的RPC接口與Supervisord進行通信
- PROCESS_LOG 進程產生日志輸出,包括標準輸出和標準錯誤輸出
- PROCESS_LOG_STDOUT 進程產生標準輸出
- PROCESS_LOG_STDERR 進程產生標準錯誤輸出
- PROCESS_COMMUNICATION 進程的日志輸出包含 和
- PROCESS_COMMUNICATION_STDOUT 進程的標準輸出包含 和
- PROCESS_COMMUNICATION_STDERR進程的標準錯誤輸出包含 和
- SUPERVISOR_STATE_CHANGE_RUNNING Supervisord 啟動
- SUPERVISOR_STATE_CHANGE_STOPPING Supervisord 停止
- TICK_5 每隔5秒觸發
- TICK_60 每隔60秒觸發
- TICK_3600 每隔3600觸發
- PROCESS_GROUP Supervisord的進程組發生變化
- PROCESS_GROUP_ADDED 新增了Supervisord的進程組
- PROCESS_GROUP_REMOVED 刪除了Supervisord的進程組
安裝superlance
也是python程序,直接pip 安裝
pip install superlance
superlance實戰
在實際配置supervisor使用superlance之前,首先要安裝sendmail,superlance使用這個命令行工具來發送email,利用各種包管理工具都可以簡單的安裝:
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz tar zxvf sendEmail-v1.56.tar.gz cp sendEmail-v1.56/sendEmail /usr/bin/sendemail
發郵件測試一下
sendemail -f 發件人郵箱 -t 收件人郵箱 -s 發件人郵箱smtp服務器 -u "sendEmail" -m "haha" -xu 發件人郵箱 -xp 發件人郵箱密碼 -f 發件人 -t 收件人 -s 發件人smtp服務器 -u 主題 -m 內容 -xu 發件人用戶名 -xp 發件人密碼
現在要做的就是配置一個supervisor配置文件,來一直監聽進程的狀態變化
[eventlistener:crashmail] command=crashmail -a -s "sendemail -f dataalarm@wjoyxt.com -t alarm@wjoyxt.com -s smtp.mxhichina.com -u 'Process is crashed' -xu dataalarm@wjoyxt.com -xp Bigdata@2019@ -m >/dev/null 2>&1" -m alarm@wjoyxt.com events=PROCESS_STATE_EXITED redirect_stderr=false
或
[eventlistener:crashmail] command=crashmail -a -s "mail -s 'Process is crashed' alarm@wjoyxt.com" -m alarm@wjoyxt.com events=PROCESS_STATE_EXITED redirect_stderr=false
command參數中 -p 參數配置了crashmail只會對名為redis的監控項作出響應,而 -m 參數中則配置了崩潰郵件會被發送到的地址,-a 監控所有項
crashmail是一個主管“事件監聽器”,用于訂閱PROCESS_STATE_EXITED事件。當crashmail 收到該事件并且轉換是"意外的(not expected)"時,crashmail 會將電子郵件通知發送到已配置的地址
events=PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR 多個事件時,用逗號隔開
PROCESS_STATE_EXITED是在一個supervisor的監控項對應的進程意外退出時會觸發的事件,這就使得一個進程出現意外退出的情況下會通知到crashmail。
crashmail.py [-p processname] [-a] [-o string] [-m mail_address] [-s sendmail]網址 選項: -p - 指定supervisor process_name。這個過程發送郵件 意外地轉換到EXITED狀態。如果這個過程是 組的一部分,可以使用 'process_name:group_name'語法。 -a - 當supervisord的任何孩子過渡時發送郵件 出人意料地意外地離開了EXITED狀態。覆蓋任何-p 在同一個crashmail進程調用中傳遞的參數。 -o - 指定用作郵件主題標題中前綴的參數。 -s - 用于發送電子郵件的sendmail命令 (例如“ / usr / sbin / sendmail - t - i ”)。必須是接受的命令 stdin上的頭和消息數據并發送郵件。默認是 “ / usr / sbin / sendmail - t - i ”。 -m - 指定電子郵件地址。該腳本將向此發送郵件 crashmail檢測到進程崩潰時的地址。如果沒有電子郵件 如果指定了地址,則不會發送電子郵件。 可以多次指定-p選項,允許 多個過程的規范。指定-a會覆蓋任何 選擇-p。 示例調用: crashmail.py -p program1 -p group1:program2 -m dev@example.com
添加好一個進程配置文件后
supervisorctl reload
重啟一下
整體示例代碼
[program:eacloud] command=/root/python/bin/uwsgi --ini uwsgi.ini ; 程序啟動命令 directory=/root/tyy autostart=true ; 在supervisord啟動的時候也自動啟動 startsecs=10 ; 啟動10秒后沒有異常退出,就表示進程正常啟動了,默認為1秒 autorestart=true ; 程序退出后自動重啟,可選值:[unexpected,true,false],默認為unexpected,表示進程意外殺死后才重啟 startretries=3 ; 啟動失敗自動重試次數,默認是3 user=root ; 用哪個用戶啟動進程,默認是root priority=999 ; 進程啟動優先級,默認999,值小的優先啟動 redirect_stderr=true ; 把stderr重定向到stdout,默認false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默認50MB stdout_logfile_backups = 20 ; stdout 日志文件備份數,默認是10 ; stdout 日志文件,需要注意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日志文件) stdout_logfile=/root/tyy/eacloud.log stopasgroup=false ;默認為false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程 killasgroup=false ;默認為false,向進程組發送kill信號,包括子進程 [eventlistener:crashmail-exited] command=/root/python/bin/crashmail -p eacloud -m 1524701427@qq.com events=PROCESS_STATE redirect_stderr=false
原文鏈接:https://blog.csdn.net/python36/article/details/122576601
相關推薦
- 2022-04-14 如何解決:git push error: failed to push some refs to
- 2022-04-28 Python中turtle.write方法使用說明_python
- 2022-07-30 沒有匹配的倉庫可以修改:PowerTools
- 2023-01-05 詳解C++中四種類型的轉換_C 語言
- 2022-03-08 基于Redis實現阻塞隊列的方式_Redis
- 2022-03-15 nginx 請求的時候 500錯誤 failed (13: Permission denied)
- 2023-02-01 MongoDB?事務支持詳解_MongoDB
- 2022-11-04 LyScript實現Hook改寫MessageBox的方法詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支