## :-: 进程守护
进程守护我们这里使用的是[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>