使用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
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
可使用-c參數指定配置文件,若是沒有指定的話會從如下位置尋找配置文件,
$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
../etc/supervisord.conf (Relative to the executable)
../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是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=========