Supervisord 守护程序运行

注意

如果修改了系统,不只要重启被守护的程序,还要重启Supervisord

安装

  1. easy_install supervisor # 必须安装setuptools
  2. 下载源码安装,解压后执行,setup.py install
  3. 也可以直接使用 yum -y install supervisor 安装

配置

默认主配置文件: /etc/supervisord.conf

; Sample supervisor config file.
[unix_http_server]
file=/var/run/supervisor/supervisor.sock ; Socket文件
;chmod=0700 ; socket文件的权限,默认0700
;chown=nobody:nogroup ; socket文件的属主与属组
;username=user ; 运行用户
;password=123 ; 用户密码
;[inet_http_server] ; 管理界面,默认关闭
;port=127.0.0.1:9001 ; 监听的IP与端口
;username=user ; 登陆用户名
;password=123 ; 登陆密码
[supervisord] ; 主进程配置
; 主日志文件,默认为$CWD/supervisord.log
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,默认50MB,超过之后会轮转
logfile_backups=10 ;日志文件保留个数,默认10个
loglevel=info ;日志等级,默认info,可选[debug,warn,trace]
pidfile=/var/run/supervisord.pid ; PID 文件
nodaemon=false ; 不以后台进程运行,默认为 false
minfds=1024 ;最小打开文件数,默认1024
minprocs=200 ;最小打开进程数,默认200
;umask=022 ;进程文件创建时的权限掩码
;user=chrism ; (default is current user, required if root)
;identifier=supervisor ;supervisord的标识
;directory=/tmp ;启动目录,默认不进行切换
;nocleanup=true ;不清除临时文件,在开启时,默认false
;childlogdir=/tmp ;自动子目录日志,默认 $TEMP
;environment=KEY=value ;环境变量
;strip_ansi=false ;删除转义的ansi字符,默认false

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor] ;RPC接口配置
supervisor.rpcinterface_factory=
supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; Socket文件
;serverurl=http://127.0.0.1:9001 ; Web地址
;username=chris ; 如果设置,应该与http_username相同
;password=123 ; 如果设置,应该与http_password相同
;prompt=mysupervisor ;CMD提示,默认supervisor
;history_file=~/.sc_history ;命令历史记录,如果可以,推荐使用[readline]

;子项程序的全局启动配置,可以创建单独子项配置来覆盖
;[program:程序名]
;command=/bin/cat ;启动命令,基于PATH的相对路径
;process_name=%(program_name)s ; 程序进程名,默认: %(program_name)s)
;numprocs=1 ;要启动的进程拷贝数
;directory=/tmp ;到此目录下,才执行命令
;umask=022 ;程序进程掩码,默认None
;priority=999 ;启动优先组,默认 999
;autostart=true ;自动启动,默认true
;autorestart=true ;自动重启,默认true
;startsecs=10 ;保持启动状态N秒,默认1
;startretries=3 ;最大启动失败次数,之后不在启动,默认3
;exitcodes=0,2 ;程序的退出代码
;stopsignal=QUIT ;程序终止信号,默认TERM
;stopwaitsecs=10 ;程序终止时,最大等待秒数,默认10
;user=chrism ; 运行程序的用户
;redirect_stderr=true ;重定向错误信息到标准输出,默认false
;stdout_logfile=/a/path ;标准日志文件,默认AUTO
;stdout_logfile_maxbytes=1MB ;标准日志文件的大小最大值,默认50MB
;stdout_logfile_backups=10 ;标准日志文件的数量最大保留数
;stdout_capture_maxbytes=1MB ;不知道做啥的,默认0
;stdout_events_enabled=false ;触发事件,在日志写入时,默认false
;stderr_logfile=/a/path ;错误日志
;stderr_logfile_maxbytes=1MB ;错误日志大小,默认50MB
;stderr_logfile_backups=10 ;错误日志文件保留数,默认10
;stderr_capture_maxbytes=1MB ;不知道做啥的,默认0
;stderr_events_enabled=false ;触发事件,在错误日志写入时,默认false
;environment=A=1,B=2 ;环境变量
;serverurl=AUTO ; 覆盖【serverurl】

; 事件监听配置
;[eventlistener:事件监听名]
;command=/bin/eventlistener ; 命令
;process_name=%(program_name)s ; 进程名 (default %(program_name)s)
;numprocs=1 ; 启动进程数 (def 1)
;events=EVENT ; 事件 (req'd)
;buffer_size=10 ; 事件队列大小 (default 10)
;directory=/tmp ; 执行前,切换的目录 (def no cwd)
;umask=022 ; 进程掩码 (default None)
;priority=-1 ; 优先组 (default -1)
;autostart=true ; 自动启动 (default: true)
;autorestart=unexpected ; 自动重启 (default: unexpected)
;startsecs=10 ; 保持运行的最小秒数 (def. 1)
;startretries=3 ; 启动失败,最大次数 (default 3)
;exitcodes=0,2 ; 进程退出值 (default 0,2)
;stopsignal=QUIT ; 进程退出信号 (default TERM)
;stopwaitsecs=10 ; 退出时的等待秒数 (default 10)
;user=chrism ; 运行用户
;redirect_stderr=true ; 重定向错误日志 (default false)
;stdout_logfile=/a/path ; 日志, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB ; 日志大小,之后轮转 (default 50MB)
;stdout_logfile_backups=10 ; 日志文件保留数量 (default 10)
;stdout_events_enabled=false ; 触发事件,在日志写入时 (default false)
;stderr_logfile=/a/path ; 错误日志, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; 错误日志大小,之后轮转 (default 50MB)
;stderr_logfile_backups ; 错误日志保留数量 (default 10)
;stderr_events_enabled=false ; 触发事件,在错误日志写入时(def false)
;environment=A=1,B=2 ; 环境变量
;serverurl=AUTO ; 覆盖[serverurl]配置 (childutils)

; 程序组配置
;[group:组名]
;programs=progname1,progname2 ; 组中的所有程序名,[program:程序名]
;priority=999 ; 优先级 (default 999)

; [include] 只能包含files设置
; 其可以是多个文件的列表(用空格或新行分开),也可以包含通配符
; 会根据文件名解析到相应的文件
; 被包含的文件,不能包含自己
[include]
files = supervisord.d/*.ini

子配置文件,默认是放在:
/etc/supervisord.d
会在主配置文件的最后一行,引入:
[include]
files = supervisord.d/*.ini

子配置,具体字段说明,参考上面的

[program:zgyd11]
directory=/data/site
command=/data/site/zgyd11
autostart=true
user=root
startsecs=10
autorestart=true
startretries=3
priority=999
redirect_stderr=false
stdout_logfile_maxbytes=10MB
stdout_logfile_backups = 20
killasgroup=false
stderr_logfile=/data/site/logs/zgyd11.err.log
stdout_logfile=/data/site/logs/zgyd11.out.log

启动与管理

  1. supervisord 启动程序
  2. supervisorctl stop|start|restart programXXX 停止其中一个程序,参考:[program:blogdemon] 配置段,此操作都不会重启加载配置文件
  3. supervisorctl stop all #停止全部
  4. supervisorctl reload # 重新加载配置文件,并以新配置文件运行