使用Supervisor管理Redis進程

使用Supervisor管理Redis進程html

環境:MAC OSpython

Supervisor (http://supervisord.org) 是一個用 Python 寫的進程管理工具,能夠很方便的用來啓動、重啓、關閉進程(不單單是 Python 進程)。除了對單個進程的控制,還能夠同時啓動、關閉多個進程,好比很不幸的服務器出問題致使全部應用程序都被殺死,此時能夠用 supervisor 同時啓動全部應用程序而不是一個一個地敲命令啓動。git

安裝過程,redis

安裝pip:shell

➜  ~ sudo easy_install pip服務器

而後安裝supervisor
svn

➜  ~ sudo pip install supervisor工具

安裝完成。spa


supervisord配置

Supervisor 至關強大,提供了很豐富的功能,不過咱們可能只須要用到其中一小部分。安裝完成以後,能夠編寫配置文件,來知足本身的需求。爲了方便,咱們把配置分紅兩部分:supervisord(supervisor 是一個 C/S 模型的程序,這是 server 端,對應的有 client 端:supervisorctl)和應用程序(即咱們要管理的程序)。.net

首先來看 supervisord 的配置文件。安裝完 supervisor 以後,能夠運行echo_supervisord_conf 命令輸出默認的配置項,也能夠重定向到一個配置文件裏:

➜  ~ type echo_supervisord_conf
echo_supervisord_conf is /usr/local/bin/echo_supervisord_conf
➜  ~ echo_supervisord_conf > /Users/xinxingegeya/IDE/supervisor/etc/supervisord.conf

生成的該配置文件爲默認配置選項,具體詳細介紹請參照:http://supervisord.org/configuration.html


啓動supervisord

可使用-c參數指定配置文件,若是沒有指定的話會從如下位置尋找配置文件,

  1. $CWD/supervisord.conf

  2. $CWD/etc/supervisord.conf

  3. /etc/supervisord.conf

  4. ../etc/supervisord.conf (Relative to the executable)

  5. ../supervisord.conf (Relative to the executable)

注意:CWD是current work directory的縮寫。

以下啓動supervisord,

➜  supervisor supervisord -c ./etc/supervisord.conf
➜  supervisor ps -ef | grep supervisord
  501  1441     1   0 11:45下午 ??         0:00.01 /usr/bin/python /usr/local/bin/supervisord -c ./etc/supervisord.conf
  501  1455   822   0 11:45下午 ttys000    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn supervisord
➜  supervisor

能夠看到啓動成功。那麼如何來管理進程呢?


進程管理的配置文件

使用supervisor管理進程,首先要有一個進程的配置文件,以redis的進程爲例,使用supervisor管理redis的進程。

redis的安裝過程略,具體能夠參考http://my.oschina.net/xinxingegeya/blog/389155,下面來配置一個redis進程的配置文件。

[program:redis_7000]
directory = /Users/xinxingegeya/IDE/redis/redis_7000 ; 程序的啓動目錄
command = /usr/local/bin/redis-server /Users/xinxingegeya/IDE/redis/redis_7000/7000.conf  ; 啓動命令,能夠看出與手動在命令行啓動的命令是同樣的
autostart = true     ; 在 supervisord 啓動的時候也自動啓動
autorestart = true   ; 程序異常退出後自動重啓
startsecs = 5        ; 啓動 5 秒後沒有異常退出,就看成已經正常啓動了
startretries = 3     ; 啓動失敗自動重試次數,默認是 3
user = xinxingegeya          ; 用哪一個用戶啓動
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes = 20MB  ; stdout 日誌文件大小,默認 50MB
stdout_logfile_backups = 20     ; stdout 日誌文件備份數
; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件)
stdout_logfile = /Users/xinxingegeya/IDE/redis/log/redis_7000_stdout.log

該program的名字表示這是一個在端口7000上啓動的redis進程。注意redis進程要以非daemon方式啓動。

須要在supervisord.conf配置文件中包含該進程配置文件。打開supervisord.conf配置文件修改include選項爲:

[include]
files = ../*.supervisor

表示該配置文件所在目錄的父級目錄中的以supervisor結尾的配置都要包含進來。

剛纔配置的redis_7000進程的配置文件的路徑爲,

/Users/xinxingegeya/IDE/redis/redis_7000/redis_7000.supervisor

因此要在supervisord.conf的父級目錄中建立一個以supervisor結尾的軟連接。以下,

➜  supervisor ln ~/IDE/redis/redis_7000/redis_7000.supervisor redis_7000.supervisor
➜  supervisor ll
total 88
drwxr-xr-x  3 xinxingegeya  staff   102B  4 14 00:09 etc
-rw-r--r--@ 2 xinxingegeya  staff    41K  3 23 22:21 redis_7000.supervisor
➜  supervisor

剛纔更改了supervisor的配置,從新啓動一下supervisord


使用supervisorctl

Supervisorctl是supervisord的一個命令行客戶端工具,啓動時須要指定與 supervisord 使用同一份配置文件,不然與 supervisord 同樣按照順序查找配置文件。

啓動supervisor後,運行supervisorctl命令,以下,

➜  supervisor supervisorctl
redis_7000                       RUNNING   pid 3479, uptime 0:00:09
supervisor>

能夠看到一個被supervisor管理的進程,名字是redis_7000,運行狀態爲RUNNING。有一些命令能夠用來管理進程,好比啓動(start),停用(stop),重啓(restart),從新啓動supervisord(reload),啓動新配置或有改動的進程(update),查看被管理的進程的狀態(status)等。以下,

➜  supervisor supervisorctl
redis_7000                       RUNNING   pid 3479, uptime 0:00:09
supervisor> status
redis_7000                       RUNNING   pid 3479, uptime 0:06:10
supervisor> stop redis_7000
redis_7000: stopped
supervisor> status
redis_7000                       STOPPED   Apr 14 10:13 AM
supervisor> start redis_7000
redis_7000: started
supervisor> restart redis_7000
redis_7000: stopped
redis_7000: started
supervisor> stop redis_7000
redis_7000: stopped
supervisor> reload
Really restart the remote supervisord process y/N? y
Restarted supervisord
supervisor> status
redis_7000                       RUNNING   pid 3506, uptime 0:00:07
supervisor> update
supervisor> stop redis_7000
redis_7000: stopped
supervisor> update
supervisor> status
redis_7000                       STOPPED   Apr 14 10:15 AM
supervisor> reload
Really restart the remote supervisord process y/N? y
Restarted supervisord
supervisor> status
redis_7000                       STARTING
supervisor> status
redis_7000                       RUNNING   pid 3511, uptime 0:00:08
supervisor>

=========END=========

相關文章
相關標籤/搜索