一、前言
最近有个项目比较特殊,不能部署在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
安装使用supervisor来自动启动重启服务
原创
wx5cd0dc9e614c52022-08-20 00:19:25博主文章分类:积累©著作权
文章标签linux服务器ubuntu配置文件重启文章分类OpenStack云计算
supervisor (官网)是一个unix的系统进程管理软件,可以用它来管理apache、nginx等服务,
若服务挂了可以让它们自动重启。当然也可以用来实现golang的守护进程.
1.supervisor安装
1.以上tar包任意目录解压
# ubuntu安装:
sudo apt-get install supervisor
# centos安装
yum install -y supervisor
# 基于python库安装
pip2 install supervisor
easy_install supervisor1.2.3.4.5.6.7.
安装好之后,不出问题的话supervisor服务已经启动完成。
查看进程是否启动成功
pgrep supervisord1.
出现进程号之后表面成功启动
手动启动进程
如果上一步没发现进程号,那么可以执行下面的命令
supervisord -c /etc/supervisor/supervisord.conf1.
2.supervisor配置
打开配置文件supervisord.conf
# 配置文件一般在如下位置:
> vim /etc/supervisor/supervisord.conf 1.2.
我们可以看到文件的最后有这么一句话
[include]
files = /etc/supervisor/conf.d/*.conf1.2.
也就是说配置文件会引入/etc/supervisor/conf.d/目录下所有conf后缀的文件.
创建自定义的服务配置文件
所以我们可以在/etc/supervisor/conf.d/下建立文件ipfs.conf
注意: 日志路径不存在会启动失败! supervisor不会自己创建目录!
; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:ipfs]
directory = /usr/local/bin ; 程序的启动目录
command=/usr/local/bin/ipfs daemon ; 启动命令 最好绝对路径
autostart = true ; 在 supervisord 启动的时候也自动启动
numprocs=1 ; 默认为1
process_name=%(program_name)s ; 默认为 %(program_name)s,即 [program:x] 中的 x
user=root ; 使用 root 用户来启动该进程
autorestart=true ; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
redirect_stderr=true ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info1.2.3.4.5.6.7.8.9.10.11.12.
配置文件中的注释以
;打头
保存配置文件,重启
> supervisorctl reload1.
3.supervisor常用命令
supervisor有supervisord和supervisorctl两种命令类型:
- supervisord是服务相关的命令
- supervisorctl是客户端相关的命令
supervisor涉及的状态主要有
- running:进程处于运行状态
- starting:Supervisor 收到启动请求后,进程处于正在启动过程中
- stopped:进程处于关闭状态
- stopping:Supervisor 收到关闭请求后,进程处于正在关闭过程中
- backoff:进程进入 starting 状态后,由于马上就退出导致没能进入 running 状态
- fatal:进程没有正常启动
- exited:进程从 running 状态退出
常用的命令如下:
#关闭所有任务
supervisorctl shutdown
# 启动某个进程
supervisorctl start programxxx
# 重启某个进程
supervisorctl restart programxxx
# 停止全部进程 注:start、restart、stop都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
supervisorctl update1.2.3.4.5.6.7.8.9.10.11.12.
注意:显式用stop停止掉的进程,用reload或者update都不会自动重启
宝塔
systemctl start supervisord.service
systemctl stop supervisord.service
/www/server/panel/pyenv/bin/supervisorctl
ln -s /www/server/panel/pyenv/bin/supervisorctl /usr/bin/supervisorctl
0 条评论