使用Supervisor监控进程

1 Supervisor简介


Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动、重启(自动重启程序)、关闭进程(不仅仅是 Python 进程)。

2 安装


Ubuntu系统下:apt-get install supervisor,通过这种方式安装后,自动设置为开机启动

也可以通过 pip install supervisor 进行安装,但是需要手动启动,然后设置为开机启动。如果需要离线安装,则先使用pip download supervisor将相关的安装包下载到本地。
 

3 配置


Supervisor 是一个 C/S 模型的程序,supervisord 是 server 端,supervisorctl 是 client 端。

supervisord是supervisor的服务端,它负责自行调用启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdout和stderr 输出以及生成和处理与子进程生存期中的点相对应的“事件”。

supervisorctl是supervisor的命令行客户端(command-line client),提供类似shell的命令 交互功能。supervisorctl通过使用UNIX域套接字或Internet(TCP)套接字与supervisord服务端进行通信
 

3.1 生成主配置文件supervisord.conf

用pip方式安装,默认/etc/supervisor下没有该配置文件。
具体命令如下:

echo_supervisord_conf > supervisord.conf
sudo mkdir /etc/supervisor/
sudo cp supervisord.conf /etc/supervisor/

修改supervisord.conf,具体修改了[include]下的路径和[inet_http_server]下放开了web端口地址,可以使用web窗口管理supervisorctl。

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; ip_address:port specifier, *:port for all iface
username=user              ; default is no username (open server)
password=123456               ; default is no password (open server)

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = /etc/supervisor/conf.d/*conf

3.2 配置项目配置文件

创建项目配置文件nlp.conf,内容如下

[group:tornadoes]
programs=tornado-16018,tornado-16019

[program:tornado-16018]
directory=/home/XXX/PycharmProjects/NLPXXX_build/main ; 程序的启动目录
command=python runServer.py --port=16018 ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 30 ; 启动 10 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = XXX ; 用哪个用户启动
redirect_stderr=true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes=50MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups=10 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/home/XXX/PycharmProjects/log/tornado_16018.log

[program:tornado-16019]
directory=/home/XXX/PycharmProjects/NLPXXX/main ; 程序的启动目录
command=python runServer.py --port=16018 ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 30 ; 启动 10 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = XXX ; 用哪个用户启动
redirect_stderr=true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes=50MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups=10 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/home/damao/PycharmProjects/log/tornado_16019.log

然后将这个项目配置文件复制到 /etc/supervisor/conf.d/,这个路径是supervisord.conf文件中[include]下配置的路径

sudo mkdir /etc/supervisor/conf.d/
sudo cp nlp.conf /etc/supervisor/conf.d/

4 启动

~$ supervisord

浏览器打开:127.0.0.1:9001,之后可以看到项目的进程,如下图:

å¨è¿éæå¥å¾çæè¿°

 5 常用命令

生成配置文件

echo_supervisord_conf > /etc/supervisord.conf

启动服务

supervisord -c /etc/supervisord.conf

停止服务

supervisorctl shutdown

查看服务运行状态

supervisorctl status

停止某个服务

supervisorctl stop groupname:pogramname
例子: (supervisorctl stop tornadoes:tornado-16018)
启动某个服务

supervisorctl start groupname:pogramname

停止所有的服务

supervisorctl stop all

载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程

supervisorctl reload

根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

supervisorctl update

å¨è¿éæå¥å¾çæè¿°

6 注意事项


– supervisor 比较适合监控业务应用,且只能监控前台程序,如果你的程序是以daemon的方式启动,那么执行:supervisor status 会提示:BACKOFF Exited too quickly (process log may have details)。

–注意设置环境变量:environment=A=”1″,B=”2″ ; process environment additions (def no adds)

7 可视化集群管理

Supervisor只能管理本机的进程,不能跨机管理,cesi可以解决该问题,cesi是一款Supervisor官网推荐的第三方开源集中管理工具

下载cesi项目到本地cesi文件夹

$ mkdir ~/cesi
$ cd ~/cesi

$ # Download the project to ~/cesi directory 下载项目
$ wget https://github.com/gamegos/cesi/releases/download/v2.7.1/cesi-extended.tar.gz -O cesi.tar.gz
$ tar -xvf cesi.tar.gz

创建python虚拟环境,可选

$ python3 -m venv venv
$ source venv/bin/activate

安装依赖包

a.联网安装命令

cd cesi
pip install  -r requirements.txt 

b.离线安装命令

cd cesi
pip download -r requirements.txt -d ./requirement_packages
pip install --no-index --find-links=./requirement_packages -r requirements.txt 

启动
python3 ./cesi/run.py --config-file ./defaults/cesi.conf.toml
启动前,cesi.conf.toml配置如下,必须修改正确,尤其是监控的supervisor节点信息

[cesi]
# Database Uri
database = "sqlite:///users.db"                         # Relative path
activity_log = "activity.log"   # File path for CeSI logs
admin_username = "admin"        # Username of admin user
admin_password = "admin"        # Password of admin user

# Default supervisord nodes
[[nodes]]
name = "nlp-server"
environment = ""
username = "user"
password = "123456"
host = "192.168.0.111"
port = "9001"

å¨è¿éæå¥å¾çæè¿°

 å¨è¿éæå¥å¾çæè¿°

 

supervisor 来管理启动 CeSi
直接使用命令启动,关闭shell窗口时会结束进程。

[group:cesi]
programs=cesi-5000
[program:cesi-5000]
command=python3 /home/XXX/cesi/cesi/run.py --config-file /home/XXX/cesi/defaults/cesi.conf.toml
autostart=true
startsecs=10
starttries=3
user=XXX
priority=996
redirect_stderr=false
stdout_logfile=/home/XXX/PycharmProjects/log/cesi.log
stderr_logfile=/home/XXX/PycharmProjects/log/cesi-err.log
stopasgroup=false
killasgroup=true

Guess you like

Origin blog.csdn.net/chenbinqq/article/details/121306580