Supervisor是由Python開發的用於監控類UNIX上進程運行狀態的工具。在部署Python Web時,常常使用這樣一種架構,即Nginx + Gunicorn + Supervisor + Django/Flask/Tornado/Webpy/Pyramid。Supervisor在這裏起到的做用是監控Gunicorn,在Gunicorn宕掉後使其重啓,加強系統的穩定性。推而廣之,能夠用Supervisor監控Tomcat,MySQL,Redis等。下面介紹一下其安裝和使用。python
Supervisor只能運行在類UNIX系統中,如Linux,Mac OS和Solaris等,不支持任何版本的Windows系統。同時,Supervisor須要Python 2.4或更新版本的Python支持。redis
下面介紹兩種安裝方式。瀏覽器
在系統已安裝pip且能夠鏈接外網時,安裝十分簡單,pip install會和yum install、apt-get同樣自動安裝依賴文件:架構
[root@localhost ~]# pip install supervisor
手動安裝又分爲能夠鏈接外網和不能鏈接外網的狀況,均須要setuptools的支持,不然在python2.7
python setup.py install
時會報以下錯誤:socket
Traceback (most recent call last): File "setup.py", line 32, in <module> from setuptools import setup, find_packages ImportError: No module named setuptools
關於pip及setuptools的安裝能夠參考這裏。ide
能夠鏈接外網時,python setup.py install會自動安裝依賴文件:工具
[root@localhost ~]# cd /usr/local/src [root@localhost src]# wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz [root@localhost src]# tar zxf supervisor-3.1.3.tar.gz [root@localhost src]# cd supervisor-3.1.3 [root@localhost supervisor-3.1.3]# python setup.py install
不能鏈接外網時,須要先手動安裝Supervisor所依賴的文件,如下列出:ui
meld3url
其中,meld3是必須安裝的,elementtree博主並未安裝,依然能夠成功,讀者能夠在安裝完meld3後先試驗一下,若是Supervisor能夠安裝成功,則可再也不安裝elementtree。
安裝依賴文件的方法請參考1.2.1
節,這裏再也不贅述。
安裝成功後,多出4個命令文件,分別爲supervisord,supervisorctl,pidproxy,echo_supervisord_conf,這些命令文件位於python安裝目錄下(和pip配置有關),如/usr/local/python2.7.10/bin/supervisord
Supervisor的配置文件採用Windows ini文件的風格,以;
開頭註釋內容。使用安裝Supervisor後產生的echo_supervisord_conf命令能夠生成配置文件模板:
[root@localhost ~]# /usr/local/python2.7.10/bin/echo_supervisord_conf >> /etc/supervisord.conf
爲了快速開始使用,僅對生成的配置文件模板作少量修改。詳細的配置文件說明能夠參考這裏。
若是咱們以root用戶啓動Supervisor,須要在[supervisord]下指定user=root
:
[supervisord] ... user=root ...
啓動Supervisor:
[root@localhost ~]# supervisord -c /etc/supervisord.conf
這裏要說明的一點是,在運行Supervisor時,若是沒有使用-c
選項指定所使用的配置文件,Supervisor會自動依次尋找如下位置的配置文件:
$CWD/supervisord.conf $CWD/etc/supervisord.conf /etc/supervisord.conf
若是在這些位置沒有找到配置文件,會報以下錯誤信息:
Error: No config file found at default paths (/usr/etc/supervisord.conf, /usr/supervisord.conf, supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf); use the -c option to specify a config file at a different path
修改配置文件,在[program:custom_name]
添加配置,這裏咱們以監控redis爲例:
[program:redis_monitor] command=/usr/local/redis/bin/redis-server /etc/redis.conf ;指定監控的命令,重要 directory=/root ;指定命令運行的目錄 autorestart=true ;指定在什麼狀況下自動重啓 user=root ;指定以哪一個用戶運行command命令 ;其餘配置使用默認值便可
從新啓動Supervisor,建議使用以下方式啓動,將其放入後臺,同時將supervisord的運行日誌放入nohup.out
中:
[root@localhost ~]# nohup supervisord -n -c /etc/supervisord.conf &
supervisorctl
是一個Supervisor的命令行控制檯,使用它能夠方便的對supervisord
進行重啓、關閉,也能夠對單獨的[program:custom_name]
進程監控進行啓動、關閉等,當監控的進程較多時操做起來十分方便,可以作到選擇性的啓動、關閉被監控的進程。這裏簡單介紹一下它的用法。
在配置文件supervisord.conf
中有對supervisorctl
的配置,
[unix_http_server] ; 採用unix socket鏈接supervisord server,默認開啓 file=/tmp/supervisor.sock ; 指定socket文件所在位置 ;chmod=0700 ; 指定socket文件權限,默認爲0700 ;chown=nobody:nogroup ; 指定socket文件屬主和屬組 ;username=user ; 指定supervisorctl鏈接時須要使用的用戶名,默認不需用戶名 ;password=123 ; 指定supervisorctl鏈接時須要使用的密碼,默認不需密碼 ;[inet_http_server] ; 採用HTPP鏈接supervisord server,默認關閉 ;port=127.0.0.1:9001 ; 指定能夠鏈接supervisord server的ip地址及其所使用的端口號,*:port針對任何ip開放鏈接權限 ;username=user ; 指定supervisorctl鏈接時須要使用的用戶名,默認不需用戶名 ;password=123 ; 指定supervisorctl鏈接時須要使用的密碼,默認不需密碼 [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; 使用unix socket鏈接supervisord server ;serverurl=http://127.0.0.1:9001 ; 使用HTTP鏈接supervisord server ;username=chris ; 指定鏈接server時使用的用戶名 ;password=123 ; 指定鏈接server時使用的密碼 ;prompt=mysupervisor ; 命令行提示符,默認爲 supervisor> ;history_file=~/.sc_history ; 打開命令行歷史記錄,可使用↑↓鍵尋找歷史命令
supervisorctl
不能用來遠程打開supervisord
,使用以下命令鏈接已開啓的Supervisord,其中-s
指定鏈接server的形式(unix socket/HTTP),-u
指定用戶名,-p
指定密碼:
[root@localhost ~]# supervisorctl -s unix:///tmp/supervisor.sock -u user -p 123
若是在配置文件中已經將這些參數在[supervisorctl]
中配置完成,可直接執行配置文件進行鏈接,鏈接後
[root@localhost ~]# supervisorctl -c /etc/supervisord.conf redis.monitor RUNNING pid 54662, uptime 0:49:38
鏈接成功後能夠經過其中的help
命令查看可使用的命令及每條命令的做用:
supervisor> help default commands (type help <topic>): ===================================== add clear fg open quit remove restart start stop update avail exit maintail pid reload reread shutdown status tail version supervisor> help reload reload Restart the remote supervisord.
針對每條命令的做用這裏再也不贅述,另外說明一點,當開啓[inet_http_server]
時能夠從瀏覽器中查看supervisord
運行狀態,讀者能夠本身嘗試一下。
Supervisor不止能夠監控進程,還有其餘功能,這裏咱們只介紹了這個經常使用功能,有興趣的讀者能夠參考其官方文檔。
完。