Mac環境下使用supervisor

supervisor

Superviosr是一個UNIX-like系統上的進程監控工具,是一個Python開發的client/server系統,能夠管理和監控unix上面的進程。同daemontools同樣,它也不能監控daemon進程。node

官網地址爲:http://supervisord.org/python

supervisor特色

1,部署簡單

爲啥簡單呢?由於我們一般管理linux進程的時候,通常來講都須要本身編寫一個可以實現進程start/stop/restart/reload功能的腳本,而後丟到/etc/init.d/下面。這麼作有不少很差的地方,第一咱們要編寫這個腳本,這就很耗時耗力了。第二,當這個進程掛掉的時候,linux不會自動重啓它的,想要自動重啓的話,咱們還要本身寫一個監控重啓腳本,而supervisor則能夠完美的解決這些問題。linux

那supervisor是如何實現進程管理並重啓的呢?其實supervisor管理進程,就是經過fork/exec的方式把這些被管理的進程,看成supervisor的子進程來啓動。這樣的話,咱們只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去就OK了,這樣就省下了本身寫控制腳本帶來的麻煩。第二,被管理進程做爲supervisor的子進程,當子進程掛掉的時候,父進程能夠準確獲取子進程掛掉的信息的,因此固然也就能夠對掛掉的子進程進行自動重啓操做,固然重啓仍是不重啓,還要看你的配置文件裏面有木有設置autostart=true。ios

supervisor管理的進程、進程組信息,所有都寫在一個ini格式的文件裏。並且,咱們管理supervisor的時候的能夠在本地進行管理,也能夠遠程管理,並且supervisor提供了一個web界面,咱們能夠在web界面上監控、管理進程。 固然,本地、遠程和web管理的時候,須要調用supervisor的xml_rpc接口。nginx

2,精準

使用supervisor監控子進程,獲得的子進程狀態無疑是準確的。git

3,進程組

supervisor能夠對進程組統一管理,也就是說我們能夠把須要管理的進程寫到一個組裏面,而後咱們把這個組做爲一個對象進行管理,如啓動、中止、重啓等等操做。而linux系統則是沒有這種功能的,咱們想要中止一個進程,只能一個一個的去中止,要麼就本身寫個腳本去批量中止。github

大夥都知道linux的進程,特別是偵聽在1024端口之下的進程,通常用戶大多數狀況下,是不能對其進行控制的。想要控制的話,必需要有root權限。而supervisor提供了一個功能,能夠爲supervisord或者每一個子進程,設置一個非root的user,這個user就能夠管理它對應的進程了。web

supervisor結構

supervisor主要由Supervisord、Supervisorctl、Web server和XML-RPC interface組成。npm

  • Supervisord:主進程,負責管理進程的server,它會根據配置文件建立指定數量的應用程序的子進程,管理子進程的整個生命週期,對crash的進程重啓,對進程變化發送事件通知等。同時經過內置web server和XML-RPC Interface能夠輕鬆實現進程管理。
  • Supervisorctl:管理client,用戶經過命令行發送消息給supervisord,能夠查看進程狀態,加載配置文件,啓停進程,查看進程標準輸出和錯誤輸出,遠程操做等。
  • Web server:superviosr提供了web server功能,可經過web控制進程。
  • XML-RPC interface: XML-RPC接口,提供XML-RPC服務來對子進程進行管理和監控。

安裝部署

爲了統一python版本和各類依賴庫,推薦使用pyrun代替系統的python進行部署,同時須要在pyrun安裝pip,將安裝包下載至pkg目錄,執行以下命令:windows

/data/pyrun/bin/pip install --no-index -f pkg meld3==1.0.0

/data/pyrun/bin/pip install --no-index -f pkg elementtree==1.2.6-20050316

/data/pyrun/bin/pip install --no-index -f pkg supervisor==3.2.0

若是機器沒法聯網,也能夠源碼安裝,安裝的步驟以下:

  1. 依賴 python,可將python版本升級;
  2. 須要第三方包 meld三、setuptools、ElementTree;
setuptools (latest) from http://pypi.python.org/pypi/setuptools.
    
meld3 (latest) from http://www.plope.com/software/meld3/.
    
elementtree (latest) from http://effbot.org/downloads#elementtree.
  1. root解壓相關包,批量安裝。

安裝

Windows和Mac下均可以使用包管理工具npm進行安裝,打開終端/命令行工具,輸入如下代碼並執行:

npm install supervisor -g    //windows
sudo npm install supervisor -g    //mac

說明:Mac最好加上sudo授予管理員權限進行安裝,避免有的文件因權限問題下載失敗致使模塊沒法使用。
在這裏插入圖片描述

使用

使用supervisor主要會涉及到如下幾個命令:

# 啓動supervisor

python /usr/bin/supervisord

# 啓動監控的進程

supervisorctl start all

# 關閉監控的進程

supervisorctl stop all

# 查看狀態

supervisorctl status

# 從新加載配置文件:

supervisorctl reload

具體來講,進入Node項目根目錄,執行命令supervisor yourNodeEntrance(.js)便可啓動監聽。例如:
在這裏插入圖片描述

除此以外,supervisor 3.0版本還引入了事件,利用這個特性咱們實現實時監控進程狀態並告警。

首先了解一下supervisor提供的事件,supervisor經過子進程對應用程序進行管理,監控程序一樣做爲一個子進程運行,子進程的stdin、stdout、stderr都已經被重定向。事件處理過程以下:

  • 做爲監聽程序的子進程向stdout寫入READYn;
  • 事件發生時,supervisor會選擇一個處於Ready狀態的子進程的stdin寫入事件內容;
  • 該子進程事件處理完畢後向stdout寫入OKn或FAILn,反饋處理結果;
  • 重複上述操做

supervisor提供的多種事件類型,包括:進程狀態事件、supervisor狀態事件、定時事件、xmlrpc調用事件、進程日誌事件等等。咱們主要關注進程狀態相關事件。supervisor對進程定義了以下狀態,每一個狀態的切換都會觸發相應的事件。
在這裏插入圖片描述

開啓 web 管理

vi /usr/local/etc/supervisord.ini

# 將下面註釋去掉

[inet_http_server] ; inet (TCP) server disabled by default

port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)

username=fengjx ; (default is no username (open server))

password=fengjx1989 ; (default is no password (open server))

# 重啓服務

$ brew services start supervisor

==> Tapping homebrew/services

Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...

remote: Counting objects: 10, done.

remote: Compressing objects: 100% (7/7), done.

remote: Total 10 (delta 0), reused 6 (delta 0), pack-reused 0

Unpacking objects: 100% (10/10), done.

Tapped 0 formulae (37 files, 51KB)

==> Successfully started `supervisor` (label: homebrew.mxcl.supervisor)

在這裏插入圖片描述

進程管理

supervisord.ini 的最後一行配置:

files = /usr/local/etc/supervisor.d/*.ini

咱們能夠吧配置文件寫到 /usr/local/etc/supervisor.d/ 目錄下,只要以.ini 後綴結尾就行,例如管理nginx的狀態:

vi nginx.ini

[program:nginx]

command = sudo /usr/local/bin/nginx

stdout_logfile=/data/home/supervisor/logs/nginx_stdout.log

stdout_logfile_maxbytes=10MB

stderr_logfile=/data/home/supervisor/logs/nginx_stderr.log

stderr_logfile_maxbytes=10MB

autostart=true

autorestart=true

;environment = PATH="$PATH:/usr/local/bin"

而後,使用 supervisorctl 啓動 nginx。

supervisorctl start nginx

參考:
github上2個基於supervisor二次開發的集中進程管理工具,可在一個頁面下管理多臺機器的進程:
https://github.com/mlazarov/s...
https://github.com/TAKEALOT/n...

相關文章
相關標籤/搜索