Supervisor 的安装与使用

发布于 2022-07-18  829 次阅读


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 里,配置完成后可以直接使用。