Linux程式管理工具supervisor安裝及使用
Linux程式管理工具supervisor安裝及使用
1. 什麼是supervisor
superviosr是一個Linux/Unix系統上的程式監控工具,他/她upervisor是一個Python開發的通用的程式管理程式,可以管理和監控Linux上面的程式,能將一個普通的命令列程式變為後臺daemon,並監控程式狀態,異常退出時能自動重啟。不過同daemontools一樣,它不能監控daemon程式
superviosr官網點此。
2. 為什麼用supervisor
-
使用簡單
supervisor提供了一種統一的方式來start、stop、monitor你的程式, 程式可以單獨控制,也可以成組的控制。你可以在本地或者遠端命令列或者web介面來配置Supervisor。
在linux下的很多程式通常都是一直執行著的,一般來說都需要自己編寫一個能夠實現程式start/stop/restart/reload功能的指令碼,然後放到/etc/init.d/下面。但這樣做也有很多弊端,第一我們要為每個程式編寫一個類似指令碼,第二,當這個程式掛掉的時候,linux不會自動重啟它的,想要自動重啟的話,我們還要自己寫一個監控重啟指令碼。
而supervisor則可以完美的解決這些問題。supervisor管理程式,就是通過fork/exec的方式把這些被管理的程式,當作supervisor的子程式來啟動。這樣的話,我們只要在supervisor的配置檔案中,把要管理的程式的可執行檔案的路徑寫進去就OK了。第二,被管理程式作為supervisor的子程式,當子程式掛掉的時候,父程式可以準確獲取子程式掛掉的資訊的,所以當然也就可以對掛掉的子程式進行自動重啟,當然重啟還是不重啟,也要看你的配置檔案裡面有木有設定autostart=true了。
supervisor通過INI格式配置檔案進行配置,很容易掌握,它為每個程式提供了很多配置選項,可以使你很容易的重啟程式或者自動的輪轉日誌。 -
集中管理
supervisor管理的程式,程式組資訊,全部都寫在一個ini格式的檔案裡就OK了。而且,我們管理supervisor的時候的可以在本地進行管理,也可以遠端管理,而且supervisor提供了一個web介面,我們可以在web介面上監控,管理程式。 當然了,本地,遠端和web管理的時候,需要呼叫supervisor的xml_rpc介面,這個也是後話。
supervisor可以對程式組統一管理,也就是說我們們可以把需要管理的程式寫到一個組裡面,然後我們把這個組作為一個物件進行管理,如啟動,停止,重啟等等操作。而linux系統則是沒有這種功能的,我們想要停止一個程式,只能一個一個的去停止,要麼就自己寫個指令碼去批量停止。
3. supervisor元件
-
supervisord
主程式,負責管理程式的server,它會根據配置檔案建立指定數量的應用程式的子程式,管理子程式的整個生命週期,對crash的程式重啟,對程式變化傳送事件通知等。同時內建web server和XML-RPC Interface,輕鬆實現程式管理。。該服務的配置檔案在/etc/supervisor/supervisord.conf。 -
supervisorctl
客戶端的命令列工具,提供一個類似shell的操作介面,通過它你可以連線到不同的supervisord程式上來管理它們各自的子程式,命令通過UNIX socket或者TCP來和服務通訊。使用者通過命令列傳送訊息給supervisord,可以檢視程式狀態,載入配置檔案,啟停程式,檢視程式標準輸出和錯誤輸出,遠端操作等。服務端也可以要求客戶端提供身份驗證之後才能進行操作。 -
Web Server
superviosr提供了web server功能,可通過web控制程式(需要設定[inethttpserver]配置項)。 -
XML-RPC Interface
XML-RPC介面, 就像HTTP提供WEB UI一樣,用來控制supervisor和由它執行的程式。
4. 安裝、配置、使用
supervisor是python編寫的,可以用easy_install、pip都可以安裝,比如在我的centos機器下,安裝命令如下:
yum install python-setuptools
easy_install pip
pip install superviso
在這裡我使用pip安裝之後,在建立配置檔案的時候出錯,所以我又選擇了使用easy_install supervisor的安裝方法
當然也可以下載原始碼進行安裝,比如:
wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz --no-check-certificat
tar -zxvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
sudo python setup.py install
安裝之後可以直接supervisord執行驗證是否成功,如果報錯,再逐一解決,比如可能會報meld3版本問題,這裡給出安裝步驟:
wget http://effbot.org/media/downloads/elementtree-1.2.7-20070827-preview.zip
unzip elementtree-1.2.7-20070827-preview.zip && cd elementtree-1.2.7-20070827-preview
python setup.py install
或者下載此版本:
wget http://www.plope.com/software/meld3/meld3-0.6.5.tar.gz
tar -xf meld3-0.6.5.tar.gz && cd meld3-0.6.5
python setup.py install
如果安裝成功就可以進行下一步了:設定配置檔案。
### 生成配置檔案,且放在/etc目錄下
echo_supervisord_conf > /etc/supervisord.conf
###為了不將所有新增配置資訊全寫在一個配置檔案裡,這裡新建一個資料夾,每個程式設定一個配置檔案,相互隔離
mkdir /etc/supervisord.d/
### 修改配置檔案
vim /etc/supervisord.conf
### 加入以下配置資訊
[include]
files = /etc/supervisord.d/*.conf
### 在supervisord.conf中設定通過web可以檢視管理的程式,加入以下程式碼(預設即有,取消註釋即可)
[inet_http_server]
port=9001
username=user
password=123
啟動supervisord
# supervisord -c /etc/supervisord.conf
檢視一下是否監聽
# lsof -i:9001
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
superviso 14685 root 4u IPv4 20155719 0t0 TCP *:etlservicemgr (LISTEN)
現在通過 http://ip:9001/ 就可以檢視supervisor的web介面了(預設使用者名稱及密碼是user和123),當然目前還沒有加入任何監控的程式。
下面寫一個簡單的python指令碼,用來驗證supervisor的監控效果。
#cat /root/temp/test_http.py ###以下即是test_http.py指令碼中的程式碼
#!/usr/bin/env python
# coding=utf-8
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
if __name__ == "__main__":
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 10000
server_address = ('0.0.0.0', port)
HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
增加一個配置檔案,以便supervisor用來監控test_http.py程式。
#cat /etc/supervisord.d/supervisor_test_http.conf ### 以下即為配置檔案中的內容
[program:test_http]
command=python /root/temp/test_http.py 9999 ; 被監控的程式路徑
directory=/root/temp ; 執行前要不要先cd到目錄去,一般不用
priority=1 ;數字越高,優先順序越高
numprocs=1 ; 啟動幾個程式
autostart=true ; 隨著supervisord的啟動而啟動
autorestart=true ; 自動重啟。。當然要選上了
startretries=10 ; 啟動失敗時的最多重試次數
exitcodes=0 ; 正常退出程式碼(是說退出程式碼是這個時就不再重啟了嗎?待確定)
stopsignal=KILL ; 用來殺死程式的訊號
stopwaitsecs=10 ; 傳送SIGKILL前的等待時間
redirect_stderr=true ; 重定向stderr到stdout
重新啟動supervisord,或者重新載入配置檔案:
supervisorctl reload
### 或者
supervisorctl -c /etc/supervisord.conf
此時再訪問http頁面,就會發現test_http.py程式已經被監控了,且已經自動啟動了。
此時也可以訪問test_http.py程式提供的http服務了,比如http://ip:9999。
注意:supervisor只能監控前臺程式, 如果你的程式是通過fork方式實現的daemon服務,則不能用它監控,否則supervisor> status 會提示:BACKOFF Exited too quickly (process log may have details)。 因此像apache、tomcat服務預設啟動都是按daemon方式啟動的,則不能通過supervisor直接執行啟動指令碼(service httpd start),相反要通過一個包裝過的啟停指令碼來完成,比如tomcat在supervisor下的啟停指令碼請參考:Controlling tomcat with supervisor或者supervisor-tomcat.conf。
另外,可以將supervisor隨系統啟動而啟動,Linux 在啟動的時候會執行 /etc/rc.local 裡面的指令碼,所以只要在這裡新增執行命令即可:
# 如果是 Ubuntu 新增以下內容(這裡要寫全路徑,因為此時PATH的環境變數未必設定)
/usr/local/bin/supervisord -c /etc/supervisord.conf
# 如果是 Centos 新增以下內容
/usr/bin/supervisord -c /etc/supervisord.conf
6. supervisor管理
supervisor的管理可以用命令列工具(supervisorctl)或者web介面管理,如果一步步按上面步驟操作,那麼web管理就可以正常使用了,這裡單獨介紹下supervisorctl命令工具:
### 檢視supervisorctl支援的命令
# supervisorctl help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
### 檢視當前執行的程式列表
# supervisorctl status
test_http RUNNING pid 28087, uptime 0:05:17
其中
- update 更新新的配置到supervisord(不會重啟原來已執行的程式)
- reload,載入所有配置檔案,並按新的配置啟動、管理所有程式(會重啟原來已執行的程式)
- start xxx: 啟動某個程式
- restart xxx: 重啟某個程式
- stop xxx: 停止某一個程式(xxx),xxx為[program:theprogramname]裡配置的值
- stop groupworker: 重啟所有屬於名為groupworker這個分組的程式(start,restart同理)
- stop all,停止全部程式,注:start、restart、stop都不會載入最新的配置文
- reread,當一個服務由自動啟動修改為手動啟動時執行一下就ok
注意:如果原來的程式啟動時需要帶上引數,那通過supervisorctl start時應該先寫一個shell指令碼,然後supervisorctl執行該指令碼即可。
7. supervisor配置引數介紹
supervisord的配置檔案主要由幾個配置段構成,配置項以K/V格式呈現。
- unixhttpserver配置塊
在該配置塊的引數項表示的是一個監聽在socket上的HTTP server,如果[unixhttpserver]塊不在配置檔案中或被註釋,則不會啟動基於socket的HTTP server。該塊的引數介紹如下:
- file:一個unix domain socket的檔案路徑,HTTP/XML-RPC會監聽在這上面
- chmod:在啟動時修改unix domain socket的mode
- chown:修改socket檔案的屬主
- username:HTTP server在認證時的使用者名稱
- password:認證密碼
- inethttpserver配置塊
在該配置塊的引數項表示的是一個監聽在TCP上的HTTP server,如果[inethttpserver]塊不在配置檔案中或被註釋,則不會啟動基於TCP的HTTP server。該塊的引數介紹如下:
- port:TCP監聽的地址和埠(ip:port),這個地址會被HTTP/XML-RPC監聽
- username:HTTP server在認證時的使用者名稱
- password:認證密碼
比如:
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
表示監聽在9001埠,需要使用使用者名稱+密碼的方式訪問,訪問地址是:http//127.0.0.1:9001。
- supervisord配置塊
該配置塊的引數項是關於supervisord程式的全域性配置項。該塊的引數介紹如下:
- logfile:log檔案路徑
- logfile_maxbytes:log檔案達到多少後自動進行輪轉,單位是KB、MB、GB。如果設定為0則表示不限制日誌檔案大小
- logfile_backups:輪轉日誌備份的數量,預設是10,如果設定為0,則不備份
- loglevel:error、warn、info、debug、trace、blather、critical
- pidfile:pid檔案路徑
- umask:umask值,預設022
- nodaemon:如果設定為true,則supervisord在前臺啟動,而不是以守護程式啟動
- minfds:supervisord在成功啟動前可用的最小檔案描述符數量,預設1024
- minprocs:supervisord在成功啟動前可用的最小程式描述符數量,預設200
- nocleanup:防止supervisord在啟動的時候清除已經存在的子程式日誌檔案
- childlogdir:自動啟動的子程式的日誌目錄
- user:supervisord的執行使用者
- directory:supervisord以守護程式執行的時候切換到這個目錄
- strip_ansi:消除子程式日誌檔案中的轉義序列
- environment:一個k/v對的list列表
該塊的引數通常不需要改動就可以使用,當然也可以按需修改。
- program配置塊
該塊就是我們要監控的程式的配置項。該配置塊的頭部是有固定格式的,一個關鍵字program,後面跟著一個冒號,接下來才是程式名。例如:[program:foo],foo就是程式名,在使用supervisorctl來操作程式的時候,就是以foo來標明的。該塊的引數介紹如下:
- 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
比如下面這個選項塊就表示監控一個名叫test_http的程式:
[program:test_http]
command=python test_http.py 10000 ; 被監控的程式啟動命令
directory=/root/ ; 執行前要不要先cd到目錄去,一般不用
priority=1 ;數字越高,優先順序越高
numprocs=1 ; 啟動幾個程式
autostart=true ; 隨著supervisord的啟動而啟動
autorestart=true ; 自動重啟。。當然要選上了
startretries=10 ; 啟動失敗時的最多重試次數
exitcodes=0 ; 正常退出程式碼(是說退出程式碼是這個時就不再重啟了嗎?待確定)
stopsignal=KILL ; 用來殺死程式的訊號
stopwaitsecs=10 ; 傳送SIGKILL前的等待時間
redirect_stderr=true ; 重定向stderr到stdout
8. 叢集管理
supervisor不支援跨機器的程式監控,一個supervisord只能監控本機上的程式,大大限制了supervisor的使用。
不過由於supervisor本身支援xml-rpc,因此也有一些基於supervisor二次開發的多機器程式管理工具。比如:
- Django-Dashvisor
Web-based dashboard written in Python. Requires Django 1.3 or 1.4. - Nodervisor
Web-based dashboard written in Node.js. - Supervisord-Monitor
Web-based dashboard written in PHP. - SupervisorUI
Another Web-based dashboard written in PHP. - cesi
cesi is a web interface provides manage supervizors from same interface.
以上那麼多,我都不會,一個個試起來也很麻煩,搞不定,除了最後一個cesi,還好懂點pyhon,勉強安裝成功了。
cesi具體安裝說明請直接參考原Readme。這裡只做一點說明:
git clone https://github.com/Gamegos/cesi
cd cesi && mkdir pack
python setup.py build
python setup.py install
sqlite3 /自己的路徑path/userinfo.db < userinfo.sql
cp cesi.conf /etc/cesi.conf ### 自行修改cesi.conf內容,kv對,很簡單
cd cesi && python web.py ### 即可啟動成功
cesi.conf配置檔案的設定:
[node:local] ### 設定監控的各個機器
username = user
password = 123
host = 192.168.14.8
port = 9001
;[node:<node_name2>] ### 如果有多臺機器,就依次新增
;username = <username>
;password = <password>
;host = <hostname>
;port = <port>
;[environment:<environment_name>]
;members = <node_name>, <node_name2>
[cesi]
database = /root/temp/cesi/userinfo.db ### 設定db路徑
activity_log = /root/temp/cesi/cesi.log ### 設定log路徑
host = 0.0.0.0
一切順利的話,可通過頁面http://ip:5000,使用者名稱,密碼都是admin,最終的效果如下所示:
cesi repo上的示例效果:
Reference
http://supervisord.org/introduction.html
http://www.cnblogs.com/kaituorensheng/p/5020793.html
相關文章
- Linux程式管理工具Supervisor的安裝配置Linux
- Supervisor程式管理工具安裝配置
- 程式管理程式supervisor安裝和使用
- Supervisor 安裝與使用
- Linux Supervisor的安裝與使用入門Linux
- Supervisor 程式管理工具
- linux系統網橋管理工具brctl 安裝及使用Linux
- 安裝 supervisor
- 安裝Supervisor
- CentOS 安裝 supervisor 及配置 Redis 佇列CentOSRedis佇列
- centos8(linux): 安裝使用supervisor管理laravel佇列CentOSLinuxLaravel佇列
- Linux安裝及管理程式Linux
- vnc管理工具,vnc管理工具安裝使用教程,linux如何安裝vnc server?VNCLinuxServer
- 【Linux】使用 Supervisor管理後臺程式Linux
- Linux的ftp安裝及使用LinuxFTP
- secrets 管理工具 Vault 的介紹、安裝及使用
- Supervisor安裝與配置
- Linux下使用supervisor實現程式管理Linux
- 安裝及管理Linux應用程式Linux
- 在ubuntu supervisor 安裝 配置Ubuntu
- centos7安裝supervisorCentOS
- Go官方依賴包管理工具dep的安裝及使用Go
- BUG管理工具MantisBT的安裝配置及使用,親測可用
- Linux環境Hive安裝配置及使用LinuxHive
- Linux環境Flume安裝配置及使用Linux
- Linux環境Spark安裝配置及使用LinuxSpark
- linux安裝配置postgres及使用dblinkLinux
- Linux下安裝SVN 及 使用演示(PPT)Linux
- docker 安裝部署 supervisor 小記Docker
- Laravel 佇列安裝 supervisor 配置Laravel佇列
- Supervisor 安裝除錯記錄除錯
- 正確離線安裝supervisor
- Linux環境Sqoop安裝配置及使用LinuxOOP
- 安裝及管理程式
- nvm 安裝及使用
- 安裝及使用RSSHub
- Sublime 安裝及使用
- Docker安裝及使用Docker