## :-: 進程守護
進程守護我們這里使用的是[supervisor](http://supervisord.org/),是一個使用python編寫的工具。
CentOS下面安裝很簡單:
```
yum install supervisor
```
等待安裝完成后,編寫啟動文件
目錄:/etc/supervisord.d
在此目錄下面新建一個配置文件:caiji.ini
```
#項目名
[program:caiji]
#進程名稱
process_name=%(program_name)s
#啟動的進程數量
numprocs=1
#腳本目錄
directory=/mnt/hgfs/WWW/caiji
#腳本執行命令(完整php路徑)
command=/www/server/php/72/bin/php think caiji
#supervisor啟動的時候是否隨著同時啟動,默認True
autostart=true
#當程序exit的時候,這個program不會自動重啟,默認unexpected
#設置子進程掛掉后自動重啟的情況,有三個選項,false,unexpected和true。如果為false的時候,無論什么情況下,都不會被重新啟動,如果為unexpected,只有當進程的退出碼不在下面的exitcodes里面定義的
autorestart=true
#這個選項是子進程啟動多少秒之后,此時狀態如果是running,則我們認為啟動成功了。默認值為1
startsecs=1
#日志輸出
stderr_logfile=/mnt/hgfs/WWW/caiji/runtime/supervisor/caiji_stderr.log
stdout_logfile=/mnt/hgfs/WWW/caiji/runtime/supervisor/caiji_stdout.log
#腳本運行的用戶身份
user = root
#把 stderr 重定向到 stdout,默認 false
redirect_stderr = true
#stdout 日志文件大小,默認 50MB
stdout_logfile_maxbytes = 20MB
#stdout 日志文件備份數
stdout_logfile_backups = 20
```
supervisor 的init.d文件: /etc/init.d/supervisor
```
#!/bin/bash
#
# supervisord This scripts turns supervisord on
#
# Author: Mike McGrath <mmcgrath@redhat.com> (based off yumupdatesd)
#
# chkconfig: - 95 04
#
# description: supervisor is a process control utility. It has a web based
# xmlrpc interface as well as a few other nifty features.
# processname: supervisord
# config: /etc/supervisord.conf
# pidfile: /var/run/supervisord.pid
#
# source function library
. /etc/rc.d/init.d/functions
RETVAL=0
start() {
echo -n $"Starting supervisord: "
daemon "supervisord -c /etc/supervisord.conf "
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
}
stop() {
echo -n $"Stopping supervisord: "
killproc supervisord
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/supervisord
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|force-reload|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/supervisord ] && restart
;;
status)
status supervisord
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
exit 1
esac
exit $RETVAL
```
相關命令:
```
service supervisor start|stop|restart
supervisorctl start|stop|restart|reload 進程名稱
supervisorctl status 查看狀態
```
<blockquote class="danger">
<p>init.d里面的文件記錄給權限,不然沒發啟動</p>
<p>supervisor的日志輸出文件如果報錯,就手動在對應目錄創建空文件</p>
</blockquote>