首先,介紹一下supervisor。Supervisor(http://supervisord.org/)是用Python開發的一個client/server服務,是Linux/Unix系統下的一個進程管理工具,不支持Windows系統。它能夠很方便的監聽、啓動、中止、重啓一個或多個進程。用Supervisor管理的進程,當一個進程意外被殺死,supervisort監聽到進程死後,會自動將它從新拉起,很方便的作到進程自動恢復的功能,再也不須要本身寫shell腳原本控制python
之因此寫這篇文章,是前兩天的一個需求。。。哎 沒辦法 運維狗....nginx
環境:centos7.4web
pip install supervisor
由於是python開發的一個庫,能夠直接用pip來安裝,很方便。
supervisor安裝完成後會生成三個執行程序:supervisortd、supervisorctl、echo_supervisord_conf,分別是supervisor的守護進程服務(用於接收進程管理命令)、客戶端(用於和守護進程通訊,發送管理進程的指令)、生成初始配置文件程序。shell
建立目錄,初始化配置文件vim
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
把全部被管理的進程配置文件都放在同一個目錄,主配置文件包含進去。centos
mkdir /etc/supervisor/config.d vim /etc/supervisor/supervisord.conf [include] files = /etc/supervisor/config.d/*.conf
下面建立一個nginx的配置文件安全
[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
來啓動supervisorbash
supervisord -c /etc/supervisor/supervisord.conf
剛開始有個坑,command = /usr/local/nginx/sbin/nginx 我是這樣寫的 結果就一直啓動nginx 由於這樣的話 是後臺運行的nginx,然而supervisor 不能管理後臺運行進程,因此把nginx daemon off 守護關掉,就讓他阻塞在前臺bash運行,方便supervisor來管理。服務器
[root@test /]# supervisorctl status nginx RUNNING pid 17541, uptime 0:03:42 [root@test /]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 17541/nginx: master
此時nginx PID是一致的。運維
supervisorctl status 查看當期進程狀態 supervisorctl stop <name> 中止一個進程 supervisorctl start <name> 啓動 supervisorctl restart <name> 重啓 supervisorctl reload 重啓supervisord主進程
開啓web訪問
vim /etc/supervisor/supervisord.conf [inet_http_server] port=0.0.0.0:9001 username=user password=123
好了,上面說完了supervisor管理進程,下面開始說報警的事,有些時候,進程莫名其妙的退出了,而後又馬上被supervisor給拉起來了,致使了一些問題出現,想馬上知道這個進程已經被重啓過了怎麼辦?這時候 就能夠用superlance來了
superlance就是基於supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor自己沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。一樣的,superlance自己也是使用python編寫的
superlance是一系列命令行工具的集合,其包括如下這些命令:
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完畢了。
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的進程組
也是python程序,直接pip 安裝
pip install superlance
既然有了上面的event特性,下面就配置一個發郵件報警,當nginx莫名其妙的重啓後 就馬上發郵件通知。
這裏在說一下,centos下如何用命令行直接發郵件的,我一直都沒有用過默認 自帶的,也很差用。推薦一個比較好用的。
sendEmail,用perl語言寫好的 也都封裝好了,只須要提供發件人 郵箱帳號 密碼 smtp服務 收件人 就能夠了。
先配置一下
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
ok,發郵件測試一下,這裏我把郵箱信息隱藏一下了.....
sendemail -f 發件人郵箱 -t 收件人郵箱 -s 發件人郵箱smtp服務器 -u "sendEmail" -m "haha" -xu 發件人郵箱 -xp 發件人郵箱密碼 -f 發件人 -t 收件人 -s 發件人smtp服務器 -u 主題 -m 內容 -xu 發件人用戶名 -xp 發件人密碼
我這裏用的163發的 qq郵箱收件的,測試沒啥問題的。
ok 如今要作的就是配置一個supervisor配置文件,來一直監聽進程的狀態變化
[root@test /]# cat /etc/supervisor/config.d/mail.conf [eventlistener:crashmail-exited] command=crashmail -a -s "/usr/bin/sendemail -f xxxxxx@163.com -t xxxxxx@qq.com -s smtp.163.com -u 'nginx' -xu xxxxxxx@163.com -xp xxxxxxxx -m" -m xxxxxxxx@qq.com events=PROCESS_STATE_EXITED redirect_stderr=false
添加好一個進程配置文件後,supervisorctl reload 重啓一下
已是兩個進程在running了
下面測試一下 kill 掉nginx進程
ps aux | grep nginx kill -9 17659 17660
而後看一下supervisor
此時 nginx pid已經變化,說明kill以後 又被拉起來了。
也很快 就收到郵件報警了。嘿嘿。。
寫這篇文章,在加上實戰操做也都一小時了。。。中午都忘了吃飯了.....
好了,就到這裏了, 全過程我是實戰的一遍的,此方法絕對可行,只要按照我作的去配置,那就沒問題。。
前幾天搞了個vps 又弄了個博客。。。嘿嘿 之後就博客園 本身博客都同步起來。各位大佬不要噴我,來點訪問量 : ) 地址:http://www.binglansky.com