一、什么是supervisor

supervisor是一个Linux/Unix系统上的进程监控工具,supervisor是一个Python开发的通用的进程管理程序,可以管理和监控Linux上面的进程,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。不过同daemontools一样,它不能监控daemon进程

二、为什么要用supervisor

  • 使用简单 supervisor提供了一种统一的方式来start、stop、monitor你的进程, 进程可以单独控制,也可以成组的控制。你可以在本地或者远程命令行或者web接口来配置Supervisor。 在linux下的很多程序通常都是一直运行着的,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,然后放到/etc/init.d/下面。但这样做也有很多弊端,第一我们要为每个程序编写一个类似脚本,第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,我们还要自己写一个监控重启脚本。 而supervisor则可以完美的解决这些问题。supervisor管理进程,就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。这样的话,我们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。第二,被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,所以当然也就可以对挂掉的子进程进行自动重启,当然重启还是不重启,也要看你的配置文件里面有木有设置autostart=true了。 supervisor通过INI格式配置文件进行配置,很容易掌握,它为每个进程提供了很多配置选项,可以使你很容易的重启进程或者自动的轮转日志。
  • 集中管理 supervisor管理的进程,进程组信息,全部都写在一个ini格式的文件里就OK了。而且,我们管理supervisor的时候的可以在本地进行管理,也可以远程管理,而且supervisor提供了一个web界面,我们可以在web界面上监控,管理进程。 当然了,本地,远程和web管理的时候,需要调用supervisor的xml_rpc接口,这个也是后话。 supervisor可以对进程组统一管理,也就是说咱们可以把需要管理的进程写到一个组里面,然后我们把这个组作为一个对象进行管理,如启动,停止,重启等等操作。而linux系统则是没有这种功能的,我们想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。

三、supervisor组件组成

  • supervisord 主进程,负责管理进程的server,它会根据配置文件创建指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等。同时内置web server和XML-RPC Interface,轻松实现进程管理。。该服务的配置文件在/etc/supervisor/supervisord.conf。
  • supervisorctl 客户端的命令行工具,提供一个类似shell的操作接口,通过它你可以连接到不同的supervisord进程上来管理它们各自的子程序,命令通过UNIX socket或者TCP来和服务通讯。用户通过命令行发送消息给supervisord,可以查看进程状态,加载配置文件,启停进程,查看进程标准输出和错误输出,远程操作等。服务端也可以要求客户端提供身份验证之后才能进行操作。
  • Web Server supervisor提供了web server功能,可通过web控制进程(需要设置[inethttpserver]配置项)。
  • XML-RPC Interface XML-RPC接口, 就像HTTP提供WEB UI一样,用来控制supervisor和由它运行的程序。

四、安装与使用

# 安装
yum install python-setuptools
easy_install supervisor

# 查看版本
supervisord -v

# 设置配置文件
### 生成配置文件,且放在/etc目录下
echo_supervisord_conf > /etc/supervisord.conf

#为了不将所有新增配置信息全写在一个配置文件里,这里新建一个文件夹,每个程序设置一个配置文件,相互隔离
mkdir /etc/supervisord.d/

### 修改配置文件
vim /etc/supervisord.conf

# 加入以下配置信息
[include]
files = /etc/supervisord.d/*.conf

# 在supervisord.conf中设置通过web可以查看管理的进程,加入以下代码(默认即有,取消注释即可)
[inet_http_server]
port=9001
username=user
password=123

# 启动
supervisord -c /etc/supervisord.conf

# 查看是否监听
lsof -i:9001

# 修改默认配置文件,复制系统重启删除
将tmp改为/var/run或者/var/log或者其它

现在通过 http://ip:9001/ 就可以查看supervisor的web界面了(默认用户名及密码是user和123),当然目前还没有加入任何监控的程序。

写一个脚本进行测试

在配置的监控目录新建conf文件

/etc/supervisord.d/*.conf 

[program:LoctekReportApi]    ;  监控命名
directory=/data/LoctekPro      ; 执行前要不要先cd到目录去,一般不用
command=/root/miniconda3/envs/loctek_report_api/bin/uwsgi --ini /data/LoctekPro/uwsgi.ini  ; 文件路径的
environment=PATH=/root/miniconda3/envs/loctek_report_api/bin              ; 环境变量的bin目录
user=root           ; 用户 
autostart=true         ; 随着supervisord的启动而启动
autorestart=true        ; 自动重启。。当然要选上了
stdout_logfile=/var/log/LoctekReport/out.log  ; 日志
stderr_logfile=/var/log/LoctekReport/err.log  ; 错误日志

 在/data/LoctekPro/配置uwgi.ini文件

[uwsgi]
module = app:app  ; 启动文件名 : app
master = true
processes = 3
chdir = /data/twitter/    ;文件位置
socket = /data/twitter/myproject.sock
socket = 127.0.0.1:5003        ;socket /http 协议
logto = /data/LoctekPro/log/api.log    ;log路径
chmod-socket = 660
vacuum = true
enable-threads = true
log-maxsize = 4096000
harakiri = 60

 

可通过以下直接运行ini文件(测试是否存在代码错误)

uwsgi --ini uwsgi.ini    # uwsgi 是在文件路径下的ini脚本

确定无误后再重启supervisor服务

这里还需要多注意端口、防火墙、进程这些坑。

 

posted on 2021-06-09 11:25  李漂亮  阅读(953)  评论(0编辑  收藏  举报