首页 > 系统相关 >Supervisor 进程管理

Supervisor 进程管理

时间:2022-12-15 18:34:31浏览次数:39  
标签:supervisor supervisord 配置文件 管理 ini 进程 Supervisor uwsgi

## 一、简介

supervisor 是一个Python开发的、通用的进程管理程序。当程序中断时,supervisor能自动重启它,不再需要程序员或系统管理员自己编写代码来控制。
**supervisor要求管理程序是非daemon程序,supervisor会把程序转成daemon程序,因此若使用supervisor来管理进程,进程需要以非daemon的方式启动。**
附上supervisor官网 [点此链接进入官网](http://supervisord.org/)

## 二、组件
1. supervisord
服务端,即管理服务端的所有进程,当supervisor启动后,服务端会启动一个supervisord进程,该进程负责管理配置文件中的所有的进程,可以说,只要在配置文件中的进程,都由supervisord管理,也可以说supervisord管理的进程都是它的子进程,并且当子进程出现崩溃时可以自动重启。
2. supervisorctl
客户端,即客户端的命名输入,也就是命令行管理工具,supervisorctl可以使用命令行来管理所有的子进程,并且可以启动/停止/重启子进程,获取running子进程的列表等等。supervisorctl不仅可以连接到本机上的supervisord,还可以连接到远程的supervisord,在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的。supervisorctl和supervisord之间的通信,是通过xml_rpc完成的。
3. Web Server
Web Server组件可以在界面上管理进程,Web Server是通过XML_RPC来实现的,可以向supervisor请求数据,也可以控制supervisor及子进程。配置在`[inet_http_server]`板块里面。
4. XML_RPC接口
这是远程调用的,上面的supervisorctl和Web Server就是依赖于它。
## 三、安装与配置
本章基于阿里云服务器,Ubuntu20.04系统进行搭建。系统默认Python版本为Python 3.8.10,使用`virtualenvs`搭建的虚拟环境,名称为`django`。
管理进程主要有Nginx代理和基于后端Django的uWSGI服务。

### 1. 安装
在Python默认的版本下进行安装,不安装在虚拟环境下,

```powershell
pip3 install supervisor
```
### 2. 检查是否安装成功
输入以下命令,出现以下界面说明安装成功!
```powershell
echo_supervisord_conf
```

 

 


### 3. 生成配置文件
在etc目录下生成supervisord_conf配置文件
```powershell
echo_supervisord_conf > /etc/supervisord.conf
```
输入命令后可以进入/etc目录下,查看是否存在该文件,或者直接使用cat进行查看也行。
网上有的配置是将所有需要管理的进程都放在了supervisor.conf配置文件里面了,这里不推荐使用此方法,管理起来太过于繁琐,本章是将需要管理的进程服务分别放在了同一个目录下不同的.ini文件中,这样既能方便配置不同的需求也可以及时查看或更改配置的进程服务。

### 4. 创建子进程配置文件
在/ect目录下创建supervisord.d目录,并且进入该目录分别创建nginx.ini和uwsgi.ini子进程配置文件。

```powershell
#创建supervisord.d目录
mkdir /etc/supervisord.d -p
#进入该目录下
cd supervisord.d
#创建子进程配置文件
touch nginx.ini
touch uwsgi.ini
```
### 5. nginx子进程配置文件

```powershell
vi nginx.ini
```
粘贴一下内容到nginx.ini配置文件中

```powershell
[program:nginx]
#command为命令行,类似于linux的命令
command=/usr/sbin/nginx -g 'daemon off;'
# 打开的目录,nginx的配置文件,即也可以是项目所在目录
directory=/etc/nginx
#如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true,非必须设置
autostart=true
#这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退 出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
autorestart=true
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了
startsecs=1
# 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把此进程的状态置为FAIL
stopwaitsecs=2

#脚本运行的用户身份
user=root

#日志输出
stderr_logfile=/home/kql/project/logs/blog_stderr.log
stdout_logfile=/home/kql/project/logs/blog_stdout.log

#如果为true,则stderr的日志会被写入stdout日志文件中默认为false,非必须设置
redirect_stderr=true
#日志文件最大大小,和[supervisord]中定义的一样。默认为50
stdout_logfile_maxbytes = 20MB

#stdout日志文件备份数
stdout_logfile_backups = 20
```
输入`:wq`保存退出!

这里有个坑,`语法: daemon on | off`
缺省值: on
Do not use the “daemon” and “master_process” directives in a production mode, these options are mainly used for development only. You can use daemon off
大意:在生产环境中 daemon 和 master_process 配置均不可使用,仅用于开发测试。为了方便开发测试 Nginx 的 daemon 参数默认值为 on。如果大家使用 Docker 看过 Nginx 镜像的 Dockerfile 你就明白这个,**所以在配置nginx.ini文件中一定要加入`daemon onoff`**

### 6. uWSGI子进程配置文件
其次配置uWSGI进程,uwsgi进程是运行在django虚拟环境下的,如果直接使用,是启动的不了的。从网上看到很多帖子,有的是直接在command命令行中直接写入uwsgi所在虚拟环境的具体目录下,本章使用了一个简单的方法可以直接调用它,即使用linux的软连接创建uwsgi快捷命令。
所以先创建uwsgi的软连接。我的uwsgi所在的目录在`/root/.virtualenvs/django/bin/`下,因此输入一下命令可以直接创建。

```powershell
ln -s /root/.virtualenvs/django/bin/uwsgi /usr/local/bin/uwsgi
```
之后进入supervisord.d目录下编辑uwsgi.ini即可。

```powershell
vi uwsgi.ini
```
复制以下内容至uwsgi.ini配置文件下

```powershell
[program:wsgi]
#前面的目录是uwsgi创建的软连接所在目录,当然,也可以不写,直接写入uwsgi也可以运行,--ini后面的目录是 是我的项目下的uwsgi.ini配置文件所在的路径。
command=/usr/local/bin/uwsgi --ini /home/kql/project/backdjango/uwsgi.ini --die-on-term
#directory=/etc/nginx
autostart=true
autorestart=true
startsecs=1
stopwaitsecs=2
#脚本运行的用户身份
user=root

#日志输出
stderr_logfile=/home/kql/project/logs/plantool_stdout.log
stdout_logfile=/home/kql/project/logs/plantool_err.log

#把stderr重定向到stdout,默认为false
redirect_stderr=true
stdout_logfile_maxbytes = 20MB

#stdout日志文件备份数
stdout_logfile_backups = 20

```

**CPU使用率100%问题**
在Linux里面看下进程

```powershell
ps aux | less
```

发现占用cpu的是一堆uwsgi进程,uwsgi配置文件里processes填的是4
按道理最多只有4个uwsgi进程,但是这有十几个,每个占用率有百分之十几
**网上说法:**

> python+supervisor+uwsgi跑web程序时出现uwsgi defunct进程的cpu达到100%问题
> 这个问题的原因是supervisor中进程退出,而重启进程时的处理有问题 详细情况可以看
> https://github.com/unbit/uwsgi/issues/296
> 问题解决的办法是在uwsgi的配置文件中添加die-on-term = true参数 或者在命令行参数中添加--die-on-term参数

本人暂时加了这个参数,不确定有没有用
使用 `kill -f uwsgi -9 ` 命令
杀掉之前已经存在的uwsgi进程,一下子cpu占用率就下去了。

### 7. 更改supervisor.conf配置文件

进入/etc目录下修改supervisor.conf文件,
将以下代码更改为

```powershell
;[include]
;files = relative/directory/*.ini
```

```powershell
[include]
files = /etc/supervisord.d/*.ini
```
意思是管理的子进程配置文件所在的目录路径。`*.ini`意思是所有的.ini文件。

然后将以下代码取消注释,配置用户名、密码和端口号。

```powershell
[inet_http_server]
#所有ip都可访问9001端口管理进程
port=*:9001
#web界面登入的用户名
username=admin
#web界面登入的密码
password=123123
```
保存输入:wq退出!
### 8.启动supervisor
使用以下命令启动supervisor

```powershell
supervisord -c /etc/supervisord.conf
```
启动成功后可以使用以下命令来查看nginx和uwsgi是否启动成功

```powershell
ps -ef | grep nginx
ps -ef | grep uwsgi
ps -ef | grep supervisord
```

### 9. supervisor常用命令

```powershell
supervisorctl status #查看所有子进程服务状态
supervisorctl restart #重启所有子进程服务
supervisorctl restart name #重启子进程名字为name的服务
supervisorctl start name #开启子进程名字为name的服务
supervisorctl stop all #关闭所有子进程服务
supervisorctl stop name #停止子进程名字为name的服务
supervisorctl shutdown #关闭所有子进程服务
supervisorctl reload #重载配置文件,重启所有子进程服务
supervisorctl update #更新所有服务,一般用在添加新服务后
supervisorctl update name #更新子进程名字为name服务
```
启动成功后,记得去服务器开放9001端口,然后在浏览器中输入服务ip+9001 使用supervisor.conf里面配置的用户名跟密码登入使用即可。
出现界面如下,说明配置访问成功!

 

标签:supervisor,supervisord,配置文件,管理,ini,进程,Supervisor,uwsgi
From: https://www.cnblogs.com/kqlt/p/16985795.html

相关文章

  • Docker安装和基本原理及镜像管理
    一、Docker概述1.1IT架构的演进:裸金属→虚拟机→容器→函数化、代码化   云计算涌现出很多改变传统IT架构和运维方式的新技术,比如虚拟机、容器、微服务......
  • 《电力行业网络安全管理办法》和《电力行业网络安全等级保护管理办法》正式发布
    12月12日,国家能源局正式印发《电力行业网络安全管理办法》 和《电力行业网络安全等级保护管理办法》,要求加强电力行业网络安全监督管理,规范电力行业网络安全工作。据悉,这2......
  • Zabbix与乐维监控对比分析(三)——对象管理篇
    在前面的文章中,我们详细介绍了Zabbix与乐维监控在架构、性能、Agent管理、自动发现、权限管理等方面的对比分析,本篇是Zabbix对比乐维监控专题系列文章的第三篇——对象管理......
  • docker registry(私库)搭建,使用,WEB可视化管理部署
    DockerRegistry是Docker官方一个镜像,可以用来储存和分发Docker镜像。目前比较流行的两个镜像私库是DockerRegistry,HarBor其中HarBor最合适企业级应用,提供良好的WEB界......
  • pm包管理命令
    目录pm命令详解显示安装了多少应用显示安装了多少系统应用显示安装了多少第三方应用删除与包相关的所有数据:清除数据和缓存.相当于重新安装pm命令详解pm即packageman......
  • 【Python多任务--进程,协程】
    一、进程进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程是线程的容器,一个进程可以有多个线程进程特......
  • 【Python多任务--进程池Pool】
    进程池Pool在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocess......
  • 节能降耗 | AIRIOT智慧电力综合管理解决方案
    电力技术的发展推动各行各业的生产力,与此同时,企业中高能耗设备的应用以及输配电过程中的电能损耗,也在一定程度上加剧了电能供应压力。以工业制造业为例,企业的管理水平、能耗......
  • MySQL数据管理
    MySQL数据管理1.外键(了解)在创建表的时候,增加约束CREATETABLE`grade`( `gradeid`INT(10)NOTNULLAUTO_INCREMENTCOMMENT'年级id', `gradename`VARCHAR(50)N......
  • 【JUC】进程和线程
    目录一、进程1、概述2、进程和线程3、并发与并行4、同步与异步5、新线程的创建5.1使用Thread5.2使用Runnable配合Thread5.3FutureTask配合Thread6、自定义线程类的创建6......