使用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
posted @ 2022-08-11 19:07  gaozejie  阅读(1651)  评论(0编辑  收藏  举报