supervisor用來管理進程服務很方便html
優勢:node
1.重啓方便,無抖動感python
2.能夠分組管理進程linux
3.加入系統自動啓動後,能夠開機自啓,程序異常退出能自動啓動web
操做:shell
1.在python沙箱環境下操做supervisor,進去python 沙箱虛擬環境(virtualenv)express
$source my_env/bin/activity
這個不會的自行谷歌下緩存
2.安裝supervisorbash
$pip install supervisor
3.生成默認配置文件app
安裝好supervisor以後,默認是沒有生成配置文件的。能夠經過如下命令生成配置文件
$echo_supervisord_conf > ocp_supervisord.conf
4.啓動supervisor
$supervisord -c ocp_supervisord.conf
5.查看當前管理的進程
$supervisorctl -c ocp_supervisord.conf
$ exit
6.配置
a.配置 sock路徑,log路徑,log等級等,能夠大體瀏覽一下配置文件,以爲有須要修改的改下;
若是後面supervisor 啓動失敗,能夠多琢磨下配置文件,好比看看log/socket 路徑權限,或者開啓debug模式,或者看看文件夾是否建立,supervisor能夠自動建立文件,可是不能自動建立文件夾
b.配置進程,在supervisord.conf 最後加上下面配置,固然你也能夠放到其餘文件,經過include 引入
;進程組 [program:ocp_groupworker] directory=/data/suyuan/ocp/ ;程序啓動目錄 command=/data/suyuan/ocp_env/bin/gunicorn ocp.wsgi:application -k gevent -b 0.0.0.0:349%(process_num)01d --reload ; bash -c /data/suyuan/ocp/run_gunicorn.sh ;程序啓動命令,和手動在命令行啓動同樣,這裏有坑 user = root ; 用哪一個用戶啓動 numprocs=4 ; 啓動的數量4 process_name=%(program_name)s_349%(process_num)01d ; 每一個進程名稱 autorestart = true ; 程序異常退出後,自動啓動 autostart = true ; 程序隨着supervisor一共啓動 startsecs = 5 ; 程序啓動5s後沒有異常退出,就當作正常啓動了 startretries = 3 ; 程序失敗自動重啓次數 stdout_logfile = /var/log/supervisor/ocp_349%(process_num)01d.log redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false stdout_logfile_maxbytes = 20MB ; stdout 日誌文件大小,默認 50MB stdout_logfile_backups = 20 ; stdout 日誌文件備份數 ; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件) ; 能夠經過 environment 來添加須要的環境變量,一種常見的用法是修改 PYTHONPATH ; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere
7.重載配置後自動會重啓
$supervisorctl -c ocp_supervisord.conf
> reload
還有一些經常使用的命令:
restart ocp_groupworker:* stop ocp_groupworker:* start ocp_groupworker:* status
完成了!
感興趣能夠研究下他的配置文件,有不少功能,如提供web查看管理服務等
8有個坑要說下,supervisor 的command 不是那麼隨意的
The command that will be run when this program is started. The command can be either absolute (e.g. /path/to/programname) or relative (e.g. programname). If it is relative, the supervisord’s environment $PATH will be searched for the executable. Programs can accept arguments, e.g. /path/to/program foo bar. The command line can use double quotes to group arguments with spaces in them to pass to the program, e.g. /path/to/program/name -p "foo bar". Note that the value of command may include Python string expressions, e.g. /path/to/programname --port=80%(process_num)02d might expand to /path/to/programname --port=8000at runtime. String expressions are evaluated against a dictionary containing the keys group_name, host_node_name, process_num, program_name, here (the directory of the supervisord config file), and all supervisord’s environment variables prefixed with ENV_. Controlled programs should themselves not be daemons, as supervisord assumes it is responsible for daemonizing its subprocesses (see Nondaemonizing of Subprocesses).
a.不能使守護進程,因此 nohup 不能用
b.好像sh 、bash 的使用會有講究,我記不太清了,主要是使用不當,supervisor 沒法stop或者restart 進程,遇到的時候能夠關注下
9.supervisor組件
a.supervisord
supervisord是supervisor的服務端程序。
乾的活:啓動supervisor程序自身,啓動supervisor管理的子進程,響應來自clients的請求,重啓閃退或異常退出的子進程,把子進程的stderr或stdout記錄到日誌文件中,生成和處理Event
b.supervisorctl
這東西仍是有點用的,若是說supervisord是supervisor的服務端程序,那麼supervisorctl就是client端程序了。supervisorctl有一個類型shell的命令行界面,咱們能夠利用它來查看子進程狀態,啓動/中止/重啓子進程,獲取running子進程的列表等等。。。最牛逼的一點是,supervisorctl不只能夠鏈接到本機上的supervisord,還能夠鏈接到遠程的supervisord,固然在本機上面是經過UNIX socket鏈接的,遠程是經過TCP socket鏈接的。supervisorctl和supervisord之間的通訊,是經過xml_rpc完成的。 相應的配置在[supervisorctl]塊裏面
c.Web Server
Web Server主要能夠在界面上管理進程,Web Server實際上是經過XML_RPC來實現的,能夠向supervisor請求數據,也能夠控制supervisor及子進程。配置在[inet_http_server]塊裏面
d.XML_RPC接口
這個就是遠程調用的,上面的supervisorctl和Web Server就是它弄的
配置文件詳解
[unix_http_server] file=/tmp/supervisor.sock ; socket文件的路徑,supervisorctl用XML_RPC和supervisord通訊就是經過它進行,的。若是不設置的話,supervisorctl也就不能用了 ,不設置的話,默認爲none。 非必須設置 ;chmod=0700 ; 這個簡單,就是修改上面的那個socket文件的權限爲0700,不設置的話,默認爲0700。 非必須設置 ;chown=nobody:nogroup ; 這個同樣,修改上面的那個socket文件的屬組爲user.group,不設置的話,默認爲啓動supervisord進程的用戶及屬組。非必須設置 ;username=user ; 使用supervisorctl鏈接的時候,認證的用戶,不設置的話,默認爲不須要用戶。 非必須設置 ;password=123 ; 和上面的用戶名對應的密碼,能夠直接使用明碼,也可使用SHA加密,如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d,默認不設置。。。非必須設置 ;[inet_http_server] ; 偵聽在TCP上的socket,Web Server和遠程的supervisorctl都要用到他,不設置的話,默認爲不開啓。非必須設置 ;port=127.0.0.1:9001 ; 這個是偵聽的IP和端口,偵聽全部IP用 :9001或*:9001。,這個必須設置,只要上面的[inet_http_server]開啓了,就必須設置它 ;username=user ; 這個和上面的uinx_http_server一個樣。非必須設置 ;password=123 ; 這個也一個樣。非必須設置 [supervisord] ;這個主要是定義supervisord這個服務端進程的一些參數的,這個必須設置,不設置,supervisor就不用幹活了 logfile=/tmp/supervisord.log ; 這個是supervisord這個主進程的日誌路徑,注意和子進程的日誌不搭嘎。,默認路徑$CWD/supervisord.log,$CWD是當前目錄。。非必須設置 logfile_maxbytes=50MB ; 這個是上面那個日誌文件的最大的大小,當超過50M的時候,會生成一個新的日 ,志文件。當設置爲0時,表示不限制文件大小,默認值是50M,非必須設置。 logfile_backups=10 ; 日誌文件保持的數量,supervisor在啓動程序時,會自動建立10個buckup文件,用於log rotate,當設置爲0時,表示不限制文件的數量。,默認狀況下爲10。。。非必須設置 loglevel=info ; 日誌級別,有critical, error, warn, info, debug, trace, or blather等, 默認爲info。。。非必須設置項 pidfile=/tmp/supervisord.pid ; supervisord的pid文件路徑。,默認爲$CWD/supervisord.pid。。。非必須設置 nodaemon=false ; 若是是true,supervisord進程將在前臺運行,默認爲false,也就是後臺以守護進程運行。。。非必須設置 minfds=1024 ; 這個是最少系統空閒的文件描述符,低於這個值supervisor將不會啓動。系統的文件描述符在這裏設置cat /proc/sys/fs/file-max,默認狀況下爲1024。。。非必須設置 minprocs=200 ; 最小可用的進程描述符,低於這個值supervisor也將不會正常啓動。ulimit -u這個命令,能夠查看linux下面用戶的最大進程數,默認爲200。。。非必須設置 ;umask=022 ; 進程建立文件的掩碼,默認爲022。。非必須設置項 ;user=chrism ; 這個參數能夠設置一個非root用戶,當咱們以root用戶啓動supervisord以後。我這裏面設置的這個用戶,也能夠對supervisord進行管理,默認狀況是不設置。。。非必須設置項 ;identifier=supervisor ; 這個參數是supervisord的標識符,主要是給XML_RPC用的。當你有多個, supervisor的時候,並且想調用XML_RPC統一管理,就須要爲每一個,supervisor設置不一樣的標識符了, 默認是supervisord。。。非必需設置 ;directory=/tmp ; 這個參數是當supervisord做爲守護進程運行的時候,設置這個參數的話,啓動supervisord進程以前,會先切換到這個目錄默認不設置。。。非必須設置 ;nocleanup=true ; 這個參數當爲false的時候,會在supervisord進程啓動的時候,把之前子進程產生的日誌文件(路徑爲AUTO的狀況下)清除掉。有時候我們想要看歷史日誌,固然不想日誌被清除了。因此能夠設置爲true,默認是false,有調試需求的同窗能夠設置爲true。。。非必須設置 ;childlogdir=/tmp ; 當子進程日誌路徑爲AUTO的時候,子進程日誌文件的存放路徑。默認路徑是這個東西,執行下面的這個命令看看就OK了,處理的東西就默認路徑,python -c "import tempfile;print tempfile.gettempdir()",非必須設置 ;environment=KEY="value" ; 這個是用來設置環境變量的,supervisord在linux中啓動默認繼承了linux的環境變量,在這裏能夠設置supervisord進程特有的其餘環境變量。
;supervisord啓動子進程時,子進程會拷貝父進程的內存空間內容。 因此設置的這些環境變量也會被子進程繼承。小例子:environment=name="haha",age="hehe" 默認爲不設置。。。非必須設置 ;strip_ansi=false ; 這個選項若是設置爲true,會清除子進程日誌中的全部ANSI 序列。什麼是ANSI 序列呢?就是咱們的\n,\t這些東西。默認爲false。。。非必須設置 ; 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] ;這個選項是給XML_RPC用的,固然你若是想使用supervisord或者web server 這個選項必需要開啓的supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] ;這個主要是針對supervisorctl的一些配置 serverurl=unix:///tmp/supervisor.sock ; 這個是supervisorctl本地鏈接supervisord的時候,本地UNIX socket 路徑,注意這個是和前面的[unix_http_server]對應的默認值就是unix:///tmp/supervisor.sock。。非必須設置 ;serverurl=http://127.0.0.1:9001 ; 這個是supervisorctl遠程鏈接supervisord的時候,用到的TCP socket路徑,注意這個和前面的[inet_http_server]對應,默認就是http://127.0.0.1:9001。。。非必須項 ;username=chris ; 用戶名默認空。。非必須設置 ;password=123 ; 密碼默認空。。非必須設置 ;prompt=mysupervisor ; 輸入用戶名密碼時候的提示符 默認supervisor。。非必須設置 ;history_file=~/.sc_history ; 這個參數和shell中的history相似,咱們能夠用上下鍵來查找前面執行過的命令 默認是no file的。。因此咱們想要有這種功能,必須指定一個文件。。。非必須設置 ; The below sample program section shows all possible program subsection values, ; create one or more 'real' program: sections to be able to control them under ; supervisor.
;[program:theprogramname] ;這個就是我們要管理的子進程了,":"後面的是名字,最好別亂寫和實際進程,有點關聯最好。這樣的program咱們能夠設置一個或多個,一個program就是,要被管理的一個進程 ;command=/bin/cat ; 這個就是咱們的要啓動進程的命令路徑了,能夠帶參數,例子:/home/test.py -a 'hehe',有一點須要注意的是,咱們的command只能是那種在終端運行的進程,不能是,
;守護進程。這個想一想也知道了,好比說command=service httpd start。httpd這個進程被linux的service管理了,咱們的supervisor再去啓動這個命令這已經不是嚴格意義的子進程了。這個是個必須設置的項 ;process_name=%(program_name)s ; 這個是進程名,若是咱們下面的numprocs參數爲1的話,就不用管這個參數了,它默認值%(program_name)s也就是上面的那個program冒號後面的名字,
;可是若是numprocs爲多個的話,那就不能這麼幹了。想一想也知道,不可能每一個進程都用同一個進程名吧。 ;numprocs=1 ; 啓動進程的數目。當不爲1時,就是進程池的概念,注意process_name的設置,默認爲1 。。非必須設置 ;directory=/tmp ; 進程運行前,會前切換到這個目錄,默認不設置。。。非必須設置 ;umask=022 ; 進程掩碼,默認none,非必須 ;priority=999 ; 子進程啓動關閉優先級,優先級低的,最早啓動,關閉的時候最後關閉,默認值爲999 。。非必須設置 ;autostart=true ; 若是是true的話,子進程將在supervisord啓動後被自動啓動,默認就是true 。。非必須設置 ;autorestart=unexpected ; 這個是設置子進程掛掉後自動重啓的狀況,有三個選項,false,unexpected和true。若是爲false的時候,不管什麼狀況下,都不會被從新啓動,若是爲unexpected,
;只有當進程的退出碼不在下面的exitcodes裏面定義的退出碼的時候,纔會被自動重啓。當爲true的時候,只要子進程掛掉,將會被無,條件的重啓 ;startsecs=1 ; 這個選項是子進程啓動多少秒以後,此時狀態若是是running,則咱們認爲啓動成功了默認值爲1 。。非必須設置 ;startretries=3 ; 當進程啓動失敗後,最大嘗試啓動的次數。。當超過3次後,supervisor將把此進程的狀態置爲FAIL,默認值爲3 。。非必須設置 ;exitcodes=0,2 ; 注意和上面的的autorestart=unexpected對應。。exitcodes裏面的定義的退出碼是expected的。 ;stopsignal=QUIT ; 進程中止信號,能夠爲TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信號 默認爲TERM 。。當用設定的信號去幹掉進程,退出碼會被認爲是expected,非必須設置 ;stopwaitsecs=10 ; 這個是當咱們向子進程發送stopsignal信號後,到系統返回信息, 給supervisord,所等待的最大時間。 超過這個時間,supervisord會向該子進程發送一個強制kill的信號。 默認爲10秒。。非必須設置 ;stopasgroup=false ; 這個東西主要用於,supervisord管理的子進程,這個子進程自己還有子進程。
;那麼咱們若是僅僅幹掉supervisord的子進程的話,子進程的子進程,有可能會變成孤兒進程。因此我們能夠設置可個選項,把整個該子進程的整個進程組都幹掉。 設置爲true的話,通常killasgroup也會被設置爲true。 ;須要注意的是,該選項發送的是stop信號默認爲false。。非必須設置。。 ;killasgroup=false ; 這個和上面的stopasgroup相似,不過發送的是kill信號 ;user=chrism ; 若是supervisord是root啓動,咱們在這裏設置這個非root用戶,能夠用來管理該program,默認不設置。。。非必須設置項 ;redirect_stderr=true ; 若是爲true,則stderr的日誌會被寫入stdout日誌文件中,默認爲false,非必須設置 ;stdout_logfile=/a/path ; 子進程的stdout的日誌路徑,能夠指定路徑,AUTO,none等三個選項。設置爲none的話,將沒有日誌產生。
;設置爲AUTO的話,將隨機找一個地方生成日誌文件,並且當supervisord從新啓動的時候,之前的日誌文件會被清空。當 redirect_stderr=true的時候,sterr也會寫進這個日誌文件 ;stdout_logfile_maxbytes=1MB ; 日誌文件最大大小,和[supervisord]中定義的同樣。默認爲50 ;stdout_logfile_backups=10 ; 和[supervisord]定義的同樣。默認10 ;stdout_capture_maxbytes=1MB ; 這個東西是設定capture管道的大小,當值不爲0的時候,子進程能夠從stdout發送信息,而supervisor能夠根據信息,發送相應的event。默認爲0,爲0的時候表達關閉管道。。。非必須項 ;stdout_events_enabled=false ; 當設置爲ture的時候,當子進程由stdout向文件描述符中寫日誌的時候,將觸發supervisord發送PROCESS_LOG_STDOUT類型的event,默認爲false。。。非必須設置 ;stderr_logfile=/a/path ; 這個東西是設置stderr寫的日誌路徑,當redirect_stderr=true。這個就不用設置了,設置了也是白搭。由於它會被寫入stdout_logfile的同一個文件中,默認爲AUTO,也就是隨便找個地存,supervisord重啓被清空。。非必須設置 ;stderr_logfile_maxbytes=1MB ; 這個出現好幾回了,就不重複了 ;stderr_logfile_backups=10 ; 這個也是 ;stderr_capture_maxbytes=1MB ; 這個同樣,和stdout_capture同樣。 默認爲0,關閉狀態 ;stderr_events_enabled=false ; 這個也是同樣,默認爲false ;environment=A="1",B="2" ; 這個是該子進程的環境變量,和別的子進程是不共享的 ;serverurl=AUTO ; ; The below sample eventlistener section shows all possible ; eventlistener subsection values, create one or more 'real' ; eventlistener: sections to be able to handle event notifications ; sent by supervisor. ;[eventlistener:theeventlistenername] ;這個東西其實和program的地位是同樣的,也是suopervisor啓動的子進程,不過它乾的活是訂閱supervisord發送的event。他的名字就叫listener了。咱們能夠在listener裏面作一系列處理,好比報警等等 ;command=/bin/eventlistener ; 這個和上面的program同樣,表示listener的可執行文件的路徑 ;process_name=%(program_name)s ; 這個也同樣,進程名,當下面的numprocs爲多個的時候,才須要。不然默認就,OK了 ;numprocs=1 ; 相同的listener啓動的個數 ;events=EVENT ; event事件的類型,也就是說,只有寫在這個地方的事件類型。纔會被髮送 ;buffer_size=10 ; 這個是event隊列緩存大小,單位不太清楚,樓主猜想應該是個吧。當buffer, 超過10的時候,最舊的event將會被清除,並把新的event放進去。,默認值爲10。。非必須選項 ;directory=/tmp ; 進程執行前,會切換到這個目錄下執行,默認爲不切換。。。非必須 ;umask=022 ; 淹沒,默認爲none,不說了 ;priority=-1 ; 啓動優先級,默認-1,也不扯了 ;autostart=true ; 是否隨supervisord啓動一塊兒啓動,默認true ;autorestart=unexpected ; 是否自動重啓,和program一個樣,分true,false,unexpected等,注意,unexpected和exitcodes的關係 ;startsecs=1 ; 也是同樣,進程啓動後跑了幾秒鐘,才被認定爲成功啓動,默認1 ;startretries=3 ; 失敗最大嘗試次數,默認3 ;exitcodes=0,2 ; 指望或者說預料中的進程退出碼, ;stopsignal=QUIT ; 幹掉進程的信號,默認爲TERM,好比設置爲QUIT,那麼若是QUIT來幹這個進程,那麼會被認爲是正常維護,退出碼也被認爲是expected中的 ;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) ;stopasgroup=false ; send stop signal to the UNIX process group (default false) ;killasgroup=false ; SIGKILL the UNIX process group (def false) ;user=chrism ;設置普通用戶,能夠用來管理該listener進程。默認爲空。。非必須設置 ;redirect_stderr=true ; 爲true的話,stderr的log會併入stdout的log裏面,默認爲false。。。非必須設置 ;stdout_logfile=/a/path ; 這個不說了,好幾遍了 ;stdout_logfile_maxbytes=1MB ; 這個也是 ;stdout_logfile_backups=10 ; 這個也是 ;stdout_events_enabled=false ; 這個實際上是錯的,listener是不能發送event ;stderr_logfile=/a/path ; 這個也是 ;stderr_logfile_maxbytes=1MB ; 這個也是 ;stderr_logfile_backups ; 這個不說了 ;stderr_events_enabled=false ; 這個也是錯的,listener不能發送event ;environment=A="1",B="2" ; 這個是該子進程的環境變量,默認爲空。。。非必須設置 ;serverurl=AUTO ; override serverurl computation (childutils) ; The below sample group section shows all possible group values, ; create one or more 'real' group: sections to create "heterogeneous" ; process groups.
;[group:thegroupname] ;這個東西就是給programs分組,劃分到組裏面的program。咱們就不用一個一個去操做了, 咱們能夠對組名進行統一的操做。
;注意:program被劃分到組裏面以後,就至關於原來,的配置從supervisor的配置文件裏消失了。。。supervisor只會對組進行管理,而再也不會對組裏面的單個program進行管理了 ;programs=progname1,progname2 ; 組成員,用逗號分開,這個是個必須的設置項 ;priority=999 ; 優先級,相對於組和組之間說的,默認999。。非必須選項 ; 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] ;這個東西挺有用的,當咱們要管理的進程不少的時候,寫在一個文件裏面,就有點大了。咱們能夠把配置信息寫到多個文件中,而後include過來 ;files = relative/directory/*.ini
推薦文章
http://blog.chinaunix.net/uid-26000296-id-4759916.html