效果
使用shell脚本封装supervisor 支持start stop status restart。能够使用 control redis start|stop|status|restart 管理redis进程 并且在redis意外退出时重启(用kill命令模拟)
其中redis可被替换为其他二进制非守护程序
只是demo级的配置 具体可参考官网 http://supervisord.org/configuration.html
文件目录
supervisor的配置文件不使用默认的/etc/supervisor.conf为路径,这里使用自定义的目录
+ appconf # 进程自身的配置文件
|- redis.conf # redis的配置文件
+ conf # 针对每个进程的配置文件放在该目录下
|- redis.ini # supervisor 管理redis的配置文件
+ logs # 存放日志文件
+ run # 存放如pid sock等文件
|- control # 管理脚本
|- supervisord.conf # supervisord 全局配置文件
全局配置 supervisord.conf
; %(here)s 占位符表示配置文件所在目录
[unix_http_server]
file=%(here)s/run/supervisor.sock ;unix域socket文件 supervisorctl通过该文件与supervisord通信
[supervisord]
pidfile=%(here)s/run/supervisor.pid ;supervisord的pid文件路径
logfile=%(here)s/logs/supervisord.log ;supervisord的日志路径
loglevel=warn ;日志等级
;supervisord和supervisorctl通信必须设置 通常使用以下默认设置
;应该是设置客户端和服务端通信时xml-rpc使用的接口?对这个配置理解不是很透彻
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
;supervisorctl访问的URL 由于是单机使用 故[unix_http_server]一致 这里是unix域socket
;设置为其他机器的ip:port 便可控制其他机器的进程
serverurl=unix://%(here)s/run/supervisor.sock
;包含其他配置文件
[include]
files=conf/*.ini ;这里使用正则表达式
supervisor 管理redis的配置 redis.ini
[program:redis]
;%(program_name)s 即 program:后面部分 如这里是redis
command=redis-server %(here)s/appconf/redis.conf ;启动进程的命令 注意这里的%(here)s不是redis.ini自己所在的目录
autorestart=true ;意外退出时自动重启
stdout_logfile=%(here)s/logs/%(program_name)s.log ;设置日志
shell脚本control
全局变量定义
#!/bin/bash
program=$1 # 要启动的进程名
action=$2 # 要执行的动作
# 简单的输入检查
script_path=$(cd $(dirname $0);PWD -P) # control所在目录
run_path="${script_path}/run/" # run目录
pid_file="${run_path}/supervisor.pid" # pid文件路径
sock_file="${run_path}/supervisor.sock" # sock文件路径
conf_file="${script_path}/supervisord.conf" # supervisord配置文件
start函数
function start()
{
# 如果pid文件存在 则supervisor