supervisor 用于管理自定义任务进程,可配置服务自动重启等多种功能,方便用户的计划任务管理。
推荐采用 brew 包管理工具进行安装:
brew install supervisor
如果通过pip进行安装,需要重点关注pip所在的python环境,是处于本机系统下还是在conda env中。
不同环境下,supervisor的配置文件位置和参数有差异,容易导致问题。
检查是否安装成功:
% brew info supervisor
==> supervisor: stable 4.2.4 (bottled), HEAD
Process Control System
http://supervisord.org/
/opt/homebrew/Cellar/supervisor/4.2.4 (765 files, 10.6MB) *
Poured from bottle on 2022-10-28 at 19:42:31
From: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git/Formula/supervisor.rb
License: BSD-3-Clause-Modification
==> Dependencies
Required: python@3.10 ✔
==> Options
--HEAD
Install HEAD version
==> Caveats
To restart supervisor after an upgrade:
brew services restart supervisor
Or, if you don't want/need a background service you can just run:
/opt/homebrew/opt/supervisor/bin/supervisord -c /opt/homebrew/etc/supervisord.conf --nodaemon
==> Analytics
install: 640 (30 days), 2,119 (90 days), 15,378 (365 days)
install-on-request: 638 (30 days), 2,117 (90 days), 15,384 (365 days)
build-error: 0 (30 days)
其默认配置文件位置:/opt/homebrew/etc/supervisord.conf
这里首先说明一下,有不少文章说明是按照如下方式生成supervisord配置文件:
echo_supervisord_conf > /usr/local/etc/supervisord.ini
但是本文实践过程中,不需要这一步骤,安装完成后即自动存在supervisord.conf配置文件。
接下来,我们直接打开并修改配置文件。
打开监听TCP socket,启动inet的http服务。这个模块默认是未开启状态,打开后可通过web界面的方式管理子进程。只要将每行首位的分号;字符去掉即可。
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
username=user ; default is no username (open server)
password=123 ; default is no password (open server)
在[supervisord]
部分,可看到logfile等各类配置参数,一般情况下保持默认即可。
supervisord 与 supervisorctl 之间是服务端与客户端的关系,因此,需要配置如下:
[supervisorctl]
;serverurl=unix:///opt/homebrew/var/run/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
username=user ; should be same as in [*_http_server] if set
password=123 ; should be same as in [*_http_server] if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
这里服务端url和账户信息,要与前面 [inet_http_server]的配置保持一致。
supervisord.conf的结尾处,定义了如何管理自定义配置文件:
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /opt/homebrew/etc/supervisor.d/*.ini
因此,不推荐直接在 supervisord.conf中编写 program,而应该按照如上include说明,在同级目录下创建一个文件夹 supervisor.d,然后将自己的任务配置文件放在该文件夹下。
子进程配置项主要包括:
配置示例:
[program:frpc]
command=/Users/username/works/my_program.sh
directory=/Users/username/works
autostart=false
startsecs=5
stdout_logfile=/Users/username/works/my_program.log
启动 supervisor
supervisord -c supervisord.conf
进入 web后台管理页面,浏览器输入:http://127.0.0.1:9001
,按照提示输入前面配置的用户名密码。
登录成功后,即可通过web界面来操作已经配置的子进程。
除了通过web页面进行任务进程的管理,也可使用 supervisorctl 命令进行管理。
常用命令如下:
#关闭所有任务
supervisorctl shutdown
# 启动某个进程
supervisorctl start programxxx
# 重启某个进程
supervisorctl restart programxxx
# 停止全部进程 注:start、restart、stop都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
supervisorctl update