Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动、重启(自动重启程序)、关闭进程(不仅仅是 Python 进程)。
Ubuntu系统下:apt-get install supervisor,通过这种方式安装后,自动设置为开机启动
也可以通过 pip install supervisor 进行安装,但是需要手动启动,然后设置为开机启动。如果需要离线安装,则先使用pip download supervisor将相关的安装包下载到本地。
Supervisor 是一个 C/S 模型的程序,supervisord 是 server 端,supervisorctl 是 client 端。
supervisord是supervisor的服务端,它负责自行调用启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdout和stderr 输出以及生成和处理与子进程生存期中的点相对应的“事件”。
supervisorctl是supervisor的命令行客户端(command-line client),提供类似shell的命令 交互功能。supervisorctl通过使用UNIX域套接字或Internet(TCP)套接字与supervisord服务端进行通信
用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
创建项目配置文件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/
~$ supervisord
浏览器打开:127.0.0.1:9001,之后可以看到项目的进程,如下图:
生成配置文件
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
– supervisor 比较适合监控业务应用,且只能监控前台程序,如果你的程序是以daemon的方式启动,那么执行:supervisor status 会提示:BACKOFF Exited too quickly (process log may have details)。
–注意设置环境变量:environment=A=”1″,B=”2″ ; process environment additions (def no adds)
Supervisor只能管理本机的进程,不能跨机管理,cesi可以解决该问题,cesi是一款Supervisor官网推荐的第三方开源集中管理工具
$ 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
$ python3 -m venv venv
$ source venv/bin/activate
联网安装命令:
cd cesi
pip install -r requirements.txt
离线安装命令:
cd cesi
pip download -r requirements.txt -d ./requirement_packages
pip install --no-index --find-links=./requirement_packages -r requirements.txt
[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"
5. 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
需不需要gunicorn管理tornado进程
Nginx代理tornado进程,能够利用多核CPU,提高吞吐量
supervisor 同时开启多个进程 numprocs > 1
Ubuntu 18.04 开机自启动supervisord,好像不成功,只能在/etc/rc.local文件中添加启动命令了。
使用Supervisor监控Tornado进程
Supervisor管理springboot应用
使用supervisor管理springboot项目
记一次 Centos7 supervisor 配置管理 SpringBoot 进程
linux(centos)下安装supervisor进程管理工具