supervisor進程管理


 supervisor是一個c/s系統,被用來在類Unix系統中監控進程狀態。supervisor使用python開發。 服務端進程爲supervisord,主要負責啓動自身及其監控的子進程,響應客戶端命令,重啓異常退出的子進程,記錄子進程stdout和stderr輸出,生成和處理子進程生命週期中的事件。其配置文件通常爲/etc/supervisord.conf,能夠在配置文件中配置相關參數,包括supervisord自身的狀態,其管理的各個子進程的相關屬性等。supervisor的客戶端爲supervisorctl,它提供了一個類shell的接口(即命令行)來操做supervisord服務端。經過supervisorctl,能夠鏈接到supervisord服務進程,得到服務進程監控的子進程狀態,啓動和中止子進程,得到正在運行的進程列表。客戶端經過Unix域套接字或者TCP套接字與服務進程進行通訊,服務器端具備身份憑證認證機制,能夠有效提高安全性。當客戶端和服務端位於同一臺機器上時,客戶端與服務器共用同一個配置文件/etc/supervisord.conf,經過不一樣標籤來區分二者的配置。supervisor也提供了一個web頁面來查看和管理進程狀態。php

supervisor的好處:

  1. 簡單python

    爲啥簡單呢?由於我們一般管理linux進程的時候,通常來講都須要本身編寫一個可以實現進程start/stop/restart/reload功能的腳本,而後丟到/etc/init.d/下面。這麼作有不少很差的地方,第一咱們要編寫這個腳本,這就很耗時耗力了。第二,當這個進程掛掉的時候,linux不會自動重啓它的,想要自動重啓的話,咱們還要本身寫一個監控重啓腳本。而,supervisor則能夠完美的解決這些問題。好,怎麼解決的呢,其實supervisor管理進程,就是經過fork/exec的方式把這些被管理的進程,看成supervisor的子進程來啓動。這樣的話,咱們只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去就OK了。這樣就省下了咱們如同linux管理進程的時候,本身寫控制腳本的麻煩了。第二,被管理進程做爲supervisor的子進程,當子進程掛掉的時候,父進程能夠準確獲取子進程掛掉的信息的,因此固然也就能夠對掛掉的子進程進行自動重啓了,固然重啓仍是不重啓,也要看你的配置文件裏面有木有設置autostart=true了,這是後話。linux

  2. 精確web

    爲啥說精確呢?由於linux對進程狀態的反饋,有時候不太準確。而supervisor監控子進程,獲得的子進程狀態無疑是準確的。shell

  3. 進程組ubuntu

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

  4. 集中式管理安全

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

  5. 有效性服務器

    當supervisor的子進程掛掉的時候,操做系統會直接給supervisor發信號。而其餘的一些相似supervisor的工具,則是經過進程的pid文件,來發送信號的,而後按期輪詢來重啓失敗的進程。顯然supervisor更加高效。。。至因而哪些相似supervisor工具,這個樓主就不太清楚了,樓主還據說過god,director,可是沒用過。有興趣的朋友能夠玩玩

  6. 可擴展性

    supervisor是個開源軟件,牛逼點的,能夠直接去改軟件。不過我們大多數人仍是老老實實研究supervisot提供的接口吧,supervisor主要提供了兩個可擴展的功能。一個是event機制,這個就是樓主這兩天干的活要用到的東西。再一個是xml_rpc,supervisor的web管理端和遠程調用的時候,就要用到它了。

  7. 權限

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

  8. 兼容性,穩定性 好

supervisor的安裝和配置

安裝supervisor:

環境:ubuntu16.04

第一種安裝方法:

apt-get install -y supervisor

第二種安裝方法(自編譯):

#wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz 

而後經過python安裝:

# tar zxf supervisor-3.3.1.tar.gz

# cd supervisor

# python setup.py install
  • 配置說明

Supervisor 配置文件能夠存放的地方比較多. 一般使用系統默認的地方存放就好. 不要搞那麼複雜. 系統默認存放配置文件的目錄爲: /etc/supervisor/conf.d/, 能夠爲每一個腳本配置一個配置文件. 方便管理.

Supervisor 自己也有一個標準的配置文件. 這個有必要了解一下. 具體路徑爲: /etc/supervisor/supervisord.conf

; supervisor config file

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)

; 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:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

[include]
files = /etc/supervisor/conf.d/*.conf

開啓瀏覽器訪問(修改配置文件):

重啓supervisor生效:

systemctl restart supervisor

瀏覽器訪問效果,固然目前尚未加入任何監控的程序。

supervisor.conf文件配置格式爲段落式,以[ ]聲明一個段落。可信段落包含

  • [unix_http_server]
  • [supervisord]
  • [rpc_interface:supervisor]
  • [supervisorctl]
  • [include]

須要管理的程序以[program:program_name]段落來聲明註冊。


[unix_http_server]

unix_http_server爲supervisord的unix socker服務配置,配置此部分可爲後面的管理工具surpervisorctl方便管理supervisord。

配置項 必選 默認值 說明
file 必選 file=/var/run/supervisor.sock socket 文件保存位置
chmod 可選 chmod=0700 supervisord進程啓動的時候, 對上面 file 的文件權限進行配置
chown 可選 supervisord進程啓動的時候, 對上面 file 配置的文件用戶和用戶組進行修改, 默認爲誰啓動supervisord進程的用戶信息, 也能夠特別配置爲: chown=nobody:nogroup
username 可選 此項爲後面的 [supervisorctl] 服務, 使用 supervisorctl 命令操做管理進程的時候, 須要進行身份驗證用到的帳號.
password 可選 此項和 username 功能同樣, 密碼可使用明文或者SHA加密的密碼.
 嚴格來講,  file 也能夠不用配置, 那麼  supervisorctl 就不能用了.

[inet_http_server]

inet_http_server能夠爲supervisor配置一個簡單web管理頁面,一般supervisorctl來管理,若不是特別須要,不會啓用此配置段。

配置項 必選 默認值 說明
port 必選 web 管理平臺地址: 127.0.0.1:9001
username 可選 web 管理平臺登陸帳戶
password 可選

web 管理平臺登陸密碼

[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123

username 和 password 不配置能夠直接經過網頁訪問web管理平臺


[supervisord]

supervisord部分爲supervisor核心配置,配置項比較多
配置項 必選 默認值 說明
logfile 可選 $CWD/supervisord.log 日誌存放路徑. 默認保存在當前目錄.
logfile_maxbytes 可選 50MB 日誌文件最大值, 設置爲0不切割日誌.
logfile_backups 可選 10 日誌文件最多保留個數. 設置 0 不保存.
loglevel 可選 info 日誌等級, 通用標準等級.
pidfile 可選 $CWD/supervisord.pid PID文件路徑
umask 可選 022 進程建立文件的掩碼
nodaemon 可選 false 是否在前臺運行.
minfds 可選 1024 設置啓動時須要的系統最少可用文件描述符數量, cat /proc/sys/fs/file-max 查看當前系統的配置.
minprocs 可選 200 設置啓動時須要的系統最小可用的進程描述符數量, ulimit -u 查看當前的配置.
nocleanup 可選 false 啓動時是否清理以前的子進程的日誌. 設置true可用保留以前的日誌, 方便調試.
childlogdir 可選 tempfile.get_tempdir()  
user 可選  
directory 可選 supervisord啓動後切換到該目錄.
strip_ansi 可選 false 設置爲 true 清理日誌中的 ASNI 換行\n, \t等字符.
environment 可選 設置環境變量
identifier 可選 supervisor 設置 supervisord 的標識符, RPC可能會用到.



[rpcinterface:supervisor]

使用supervisord或者web server這個選項要開啓。

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

 


[supervisorctl]

supervisordctl管理工具配置

 

配置項 必選 默認值 說明
serverurl 必選 http://localhost:9001 本地使用 UNIX socket 鏈接, 配置爲 unix_http_server 段的 file 值, 遠程使用TCP鏈接使用 inet_http_server段的port
username 可選 帳戶
password 可選 密碼
prompt 可選 supervisor 身份驗證彈出框標題
history_file 可選 保留歷史命令文件, 相似: .bash_history



[include]

include配置能夠到指定目錄把相關的配置載入到主配置文件

配置項 必選 默認值 說明
files 必選 要載入的文件, 可使用通配符 * 載入多個配置文件.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

關鍵配置段 [program:x]

[program:x]一般使用supervisord管理的腳本都單獨寫成配置文件保存在默認的/etc/supervisord/conf.d/目錄下,每一個文件就是一個[program:program_name]配置,方便管理。

配置項 必選 默認值 說明
command 必選 須要執行的腳本, 好比: php /root/test.php
process_name 可選 %(program_name)s 進程名, 就是 [program:program_name]program_name
numprocs 可選 1 建議設置爲1, 能夠設置大於1, 作成多進程. 簡單的腳本若是要運行多份, 複製幾個配置文件, 來執行, 方便管理.
numprocs_start 可選 0 numprocs=1的時候, 無視此配置.
priority 可選 999 進程啓動關閉優先級,優先級的,最早啓動,關閉的時候最後關閉
autostart 可選 true 是否設置隨supervisord自動啓動
startsecs 可選 1 子進程啓動多少秒以後,此時狀態若是是running, 斷定爲啓動成功.
startretries 可選 3 子進程啓動失敗重試次數.
autorestart 可選 unexpected 子進程掛掉後自動重啓的狀況, 可配置: false, unexpected, true. false:不管什麼狀況下, 都不會被從新啓動. unexpected: 當進程的退出碼不在exitcodes裏面定義的退出碼的時候, 纔會被自動重啓. true: 只要子進程掛掉, 無條件的重啓
exitcodes 可選 0, 2 正常退出碼
stopsignal 可選 TERM 進程中止信號, 可選TERM, HUP, INT, QUIT, KILL, USR1, USR2等. 當用設定的信號去幹掉進程, 退出碼會被認爲是expected
stopwaitsecs 可選 10 向子進程發送stopsignal信號後,到系統返回信息給supervisord, 所等待的最大時間. 超過這個時間, supervisord會向該子進程發送一個強制kill的信號.
stopasgroup 可選 false 多子進程使用
killasgroup 可選 false 多子進程使用
user 可選  
redirect_stderr 可選 false 設置truestderr的日誌會被寫入stdout日誌文件中.
stdout_logfile 可選 AUTO 日誌路徑
stdout_logfile_maxbytes 可選 50MB  
stdout_logfile_backups 可選 10  
stdout_capture_maxbytes 可選 0  
stdout_events_enabled 可選 0  
stderr_logfile 可選 AUTO  
stderr_logfile_maxbytes 可選 50MB  
stderr_logfile_backups 可選 10  
stderr_capture_maxbytes 可選 0  
stderr_events_enabled 可選 0  
environment 可選  
directory 可選  
umask 可選  
serverurl 可選 AUTO  
# 對應通常監控腳原本說. 配置太多, 太複雜. 參考下面的一份大部分腳本使用的簡要配置.

[program:test] command
= autostart = true autorestart = ture stdout_logfile=/tmp/test_stdout.log stderr_logfile=/tmp/test_stderr.log

保存上面的內容到 /etc/supervisor/conf.d/test.conf 文件中. 在/tmp 目錄下建立test_http.py 腳本

此時再訪問http頁面,就會發現test_http.py程序已經被監控了,且已經自動啓動了。

 

sudo supervisorctl reload #重載配置文件.
sudo supervisorctl status #查看當前的進程狀態.
sudo supervisorctl stop test #中止 test 進程.
sudo supervisorctl start test #啓動 test 進程.

 

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        

其中:

  • update 更新新的配置到supervisord(不會重啓原來已運行的程序)
  • reload 要載入全部配置文件,並按照新的配置啓動、管理全部進程(會從新原來已運行的程序)
  • start xxx 啓動某個進程
  • restart xxx 重啓某個進程
  • stop xxx 中止一個進程, xxx爲[program:programname]的值
  • stop groupworker:重啓全部屬於名爲groupworker這個分組的進程(start、restart同理)
  • stop all 中止所有進程,注意:start、restart、stop都不會載入最新的配置文件
  • reread 當一個服務自動修改成手動啓動時執行一下就ok
# 在主配置文件 /etc/supervisor/supercisord.conf下配置
;[group:thegroupname] ;這個東西就是給programs分組,劃分到組裏面的program。咱們就不用一個一個去操做了 咱們能夠對組名進行統一的操做。 注意:program被劃分到組裏面以後,就至關於原來 的配置從supervisor的配置文件裏消失了。。。supervisor只會對組進行管理,而再也不 會對組裏面的單個program進行管理了 ;programs
=progname1,progname2 ; 組成員,用逗號分開 這個是個必須的設置項 ;priority=999 ; 優先級,相對於組和組之間說的 默認999。。非必須選項
相關文章
相關標籤/搜索