supervisor的安装与使用

发布于 2022-07-17  1829 次阅读


supervisor是一个用python语言编写的进程管理工具,一般我们用它来对进程进行持久化运行的管理。

安装

使用apt install supervisor即可安装supervisor
supervisor安装完成后会生成三个执行程序:supervisord、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。


生成初始配置文件

运行echo_supervisord_conf > /etc/supervisor/supervisord.conf即可在响应的目录下生产配置文件

这里有一点题外话,你可以在你想要的地方生产配置文件,但你需要运行supervisord -c supervisord.conf来显式指定配置文件的位置。
在debian中,配置文件推荐的放置位置是/etc/supervisor/supervisord.conf将配置放在此处是因为systemctl status supervisor.service的默认配置的位置是在这里,你可以很方便的使用systemctl来管理supervisor

supervisord.conf的文件权限需要755,不然无法创建需要的socket

修改配置文件

打开刚才的配置文件,一般来说只需要修改2处地方,其他的默认即可。将最后的

[include]
files = /yourpath/*.conf

进行修改,将你的其他配置文件放置在你喜欢的地方。


创建program配置

你应该根据你的需要来创建program配置。当你使用echo_supervisord_conf命令来创建配置文件时,一份带注释的program配置就已经被写入配置文件。这里我贴出一份翻译过的样例

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; 程序命令(相对使用PATH,可以带args)
;process_name=%(program_name)s ; 进程名表达式 (default %(program_name)s)
;numprocs=1                    ; 要启动的进程副本数(默认值 1)
;events=EVENT                  ; 事件通知,要订阅的类型
;buffer_size=10                ; 事件缓冲区队列大小(默认值 10)
;directory=/tmp                ; 程序的启动目录
;umask=022                     ; 进程的 umask(默认值 无)
;priority=-1                   ; 相对启动优先级(默认值 -1)
;autostart=true                ; 在 supervisord 启动的时候也自动启动(默认值:true)
;startsecs=1                   ; 启动1秒后没有退出就当做已经正常启动(默认值 1)
;startretries=3                ; 启动失败自动重试次数(默认值 3)
;autorestart=unexpected        ; 程序异常退出后自动重启(默认值 unexpected)
;exitcodes=0                   ; 与自动重启一起使用的预期退出代码(默认 0)
;stopsignal=QUIT               ; 用于终止进程的信号(默认 TERM)
;stopwaitsecs=10               ; 等待 b4 SIGKILL 的最大秒数(默认 10)
;stopasgroup=false             ; 向 UNIX 进程组发送 stop 信号(默认为 false)
;killasgroup=false             ; 向 UNIX 进程组发送 kill 信号(默认为 false)
;user=chrism                   ; 将此 UNIX 帐户设置为运行程序的账户
;redirect_stderr=false         ; 如果为 true 则 stderr 的日志会被写入 stdout 日志文件中
;stdout_logfile=/a/path        ; stdout 日志路径 NONE 表示无
;stdout_logfile_maxbytes=1MB   ; 日志文件最大大小(默认 50MB)
;stdout_logfile_backups=10     ; 日志文件最大备份数(默认 10)
;stdout_events_enabled=false   ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发supervisord发送PROCESS_LOG_STDOUT类型的event(默认 false)
;stdout_syslog=false           ; 使用进程名称将标准输出发送到系统日志(默认为 false)
;stderr_logfile=/a/path        ; stderr 日志路径 NONE 表示无
;stderr_logfile_maxbytes=1MB   ; 错误日志文件最大大小(默认 50MB)
;stderr_logfile_backups=10     ; 错误日志文件最大备份数(默认 10)
;stderr_events_enabled=false   ; 当设置为ture的时候,当子进程由stderr向文件描述符中写日志的时候,将触发supervisord发送PROCESS_LOG_STDOUT类型的event(默认 false)
;stderr_syslog=false           ; 使用进程名称将错误输出发送到系统日志(默认为 false)
;environment=A="1",B="2"       ; 子进程的环境变量
;serverurl=AUTO                ; 覆盖 serverurl 计算(childutils)

supervisorctl使用

supervisorctl status
supervisorctl stop [programname]
supervisorctl start [programname]
supervisorctl restart [programname]
supervisorctl reread
supervisorctl update

事件监听器

事件是3.0版本中引入的supervisor的高级功能。如果只是想将supervisor 用作重新启动崩溃进程的机制或用作手动控制进程状态的系统,则无需了解事件。如果想使用supervisor作为流程监控/通知框架的一部分,确实需要了解事件。

对于一些复杂的编程知识先行跳过,感兴趣的可以参考官方文档http://supervisord.org/events.html

官方提供了superlance插件,但是这个插件的邮件发送貌似需要25端口,但是现在大部分的云服务商为了防止垃圾邮件,都禁止了25端口的邮件发送。所以博主后来自己用python写了个同样的插件。地址在https://github.com/NotMings/supervisor-event-listener相应的食用方法都写在了readme里,配置完成后可以直接使用