使用Supervisor配置守护进程
一、前言
最近有个项目比较特殊,不能部署在Docker,只能部署在Linux本机,需要设置守护进程,所以用到Supervisor。
本次服务器环境为CentOS7。
二、基本概念
简单介绍一下supervisord和supervisorctl,下面会用到。
Supervisor是一个客户/服务器系统,它可以在类Unix系统中管理控制大量进程。
supervisord:服务器端,主要负责在启动自身时启动管理的子进程,响应客户端的命令,重启崩溃或退出的子进程,记录子进程stdout和stderr输出,生成和处理子进程生命周期中的事件。可以在一个配置文件中配置相关参数,包括Supervisord自身的状态,其管理的各个子进程的相关属性。
supervisorctl:客户端,通过命令行使用supervisord服务端提供的功能。通过supervisorctl,可以连接到supervisord服务器进程,获得服务器进程控制的子进程的状态,启动和停止子进程,获得正在运行的进程列表。
三、安装/卸载
# 安装
yum install -y supervisor
# 卸载
yum remove -y supervisor
四、配置
CentOS中的默认配置文件为/etc/supervisord.conf,子进程配置文件目录为/etc/supervisord.d/,配置文件目录中的配置文件后缀为.ini。一般不用默认配置,会自己创建配置文件和目录。
可以使用echo_supervisord_conf
查看默认配置文件,最好先查看一下,可能会报错,如果报错查看底部问题部分。
注意:分号开头的为注释
1、新建supervisord配置文件
- 在etc下创建目录,并赋权限
mkdir -m 700 -p /etc/supervisor
- 在目录“ /etc/supervisor”下创建配置文件,此为将默认配置文件内容写入新建的文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
- 修改配置文件
vim /etc/supervisor/supervisord.conf
在文件末尾添加,标识读取/etc/supervisor/conf.d下的所有.conf结尾的文件
[include]
files=/etc/supervisor/conf.d/*.conf
- 在目录“/etc/supervisor”下创建dotnet core 进程配置文件存放目录“conf.d”
mkdir -m 700 /etc/supervisor/conf.d
2、创建子进程配置文件
- 在/etc/supervisor/conf.d/目录新建配置文件
vim /etc/supervisor/conf.d/DotNetTest.conf
- 填入以下内容,其中DotNetTest相关均可自行替换
[program:DotNetTest] ;显示名称
command=/bin/bash -c "dotnet DotNetTest.dll" ;运行命令,启动dotnet进程,指定url可加 --urls=http://*:9096
directory=/usr/PublishOutput/ ;执行目录
stderr_logfile=/var/log/DotNetTest.error.log ;错误日志文件
stdout_logfile=/var/log/DotNetTest.stdout.log ;日志文件
stdout_logfile_maxbytes = 50MB ;默认50M
environment=ASPNETCORE_ENVIRONMENT=Production ;进程环境变量
user=root ;进程执行用户
autostart=true ;自动启动
autorestart=true ;是否自动重启
startsecs=3 ;自动重启间隔时间
startretries = 3 ;启动失败后重试次数
五、创建supervisor自启动服务
注意:使用这种方式后不能再将supervisord设为自启动服务,否则会有问题,切记。
- 新建supervisor.service文件
vim /etc/systemd/system/supervisor.service
-
粘贴以下内容
内容主要为关联supervisord命令和上面新建的配置文件
[Unit]
Description=supervisor
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
使配置生效
systemctl daemon-reload
设置服务开机启动
systemctl enable supervisor.service
启动服务
systemctl start supervisor.service
查看服务状态
systemctl status supervisor.service
其他操作
如需重启,使用
systemctl restart supervisor.service
如需移除开机自启,使用:
systemctl disable supervisor.service
六、使用supervisord管理服务
启动我们自建的supervisor服务后,即可使用supervisord提供的命令。
supervisorctl status # 查看当前运行的进程列表
supervisorctl reload # 载入所有配置文件,并按新的配置启动、管理所有进程(会重启原来已运行的程序)
supervisorctl update # 更新新的配置到supervisord(不会重启原来已运行的程序)
supervisorctl reread # 当一个服务由自动启动修改为手动启动时执行一下就ok
supervisorctl start xxx # 启动某个进程
supervisorctl stop xxx # 停止某一个进程(xxx),xxx为[program:theprogramname]里配置的值
supervisorctl restart xxx # 重启某个进程
supervisorctl stop all # 停止全部进程
比如新增了子进程配置文件时:
# 先读取到新增的配置文件
supervisorctl reread
# 更新
supervisorctl update
七、开启Web端
Web端可以在网页上管理服务,与supervisord功能一致。
1、编辑supervisord.conf文件
vim /etc/supervisor/supervisord.conf
2、修改配置
两种方式:
1、找到[inet_http_server]节点,去掉开头的分号,调整地址、用户名、密码。
2、也可以在文件最后直接新增如下节点
[inet_http_server] ;
port=*:9001 ; 地址
username=user ; 用户名
password=123 ; 密码
3、重启服务
systemctl restart supervisor
或者
systemctl reload supervisor
或者
supervisorctl reload
之后访问port里配置的地址即可访问
七、问题
1、使用echo_supervisord_conf查看默认配置文件时报如下错
Traceback (most recent call last):
File "/bin/echo_supervisord_conf", line 5, in <module>
from pkg_resources import load_entry_point
File "/usr/local/python3.6.8/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3126, in <module>
@_call_aside
File "/usr/local/python3.6.8/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3110, in _call_aside
f(*args, **kwargs)
File "/usr/local/python3.6.8/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3139, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/usr/local/python3.6.8/lib/python3.6/site-packages/pkg_resources/__init__.py", line 581, in _build_master
ws.require(__requires__)
File "/usr/local/python3.6.8/lib/python3.6/site-packages/pkg_resources/__init__.py", line 898, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/local/python3.6.8/lib/python3.6/site-packages/pkg_resources/__init__.py", line 784, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'supervisor==3.4.0' distribution was not found and is required by the application
原因:
Supervisor只支持python2.x,本机默认的python为3.x导致的。
解决:
编辑如下三个文件,将顶部python版本改为2.x版本即可
vim /usr/bin/echo_supervisord_conf
vim /usr/bin/supervisorctl
vim /usr/bin/supervisord
将顶部
#!/usr/bin/python
改为
#!/usr/bin/python2.7
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统