进程管理工具-Supervisord +CeSi

Supervisor

简介

Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动、重启(自动重启程序)、关闭进程(不仅仅是 Python 进程)
Supervisor 是一个 C/S 模型的程序,Supervisor Components组件包含了服务端和客户端,WEB端

  • supervisord 服务端
  • supervisorctl 客户端
  • Web Server WEB端
1. 基本命令
安装:
1、sudo pip install supervisor

2、默认配置文件位置:
[root@localhost /]# cat etc/supervisord.conf

3、自定义配置目录:
[root@localhost supervisord.d]# pwd
/etc/supervisord.d
[root@localhost supervisord.d]# ls
gunicorn.ini  yun.ini

4、启动服务:
[root@localhost /]# supervisord -c /etc/supervisord.conf
/usr/lib/python2.7/site-packages/supervisor/options.py:383: PkgResourcesDeprecationWarning: Parameters to load are deprecated.  Call .resolve and .require separately.
  return pkg_resources.EntryPoint.parse("x="+spec).load(False)
[root@localhost /]# ps -aux|grep supervisord
root      5135  0.1  0.8 226152 16736 ?        Ss   22:13   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root      5137  0.0  0.0 112724   992 pts/0    R+   22:13   0:00 grep --color=auto supervisord

注:kill 进程号  

5、supervisorctl 操作:
输入命令 supervisorctl 进入 supervisorctl 的 shell 交互界面:
	help # 查看帮助
	status # 查看程序状态
	stop program_name # 关闭 指定的程序
	start program_name # 启动 指定的程序
	restart program_name # 重启 指定的程序
	tail -f program_name # 查看 该程序的日志
	update # 重启配置文件修改过的程序(修改了配置,通过这个命令加载新的配置)
也可以直接输入指令:
	supervisorctl help 
	supervisorctl update 
	supervisorctl status 
	supervisorctl stop program_name 
	supervisorctl start program_name
	supervisorctl restart program_name
	supervisorctl tail -f program_name
	supervisorctl stop all ;停止所有应用
	supervisorctl start all ;启动所有应用
2. 配置文件

2.1 默认配置文件解析:

位置:etc/supervisord.conf

内容:

# 指定了socket file的位置
[unix_http_server]
file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ;socket文件的mode,默认是0700
;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid
 
 #用于启动一个含有前端的服务,可以从Web页面中管理服务。其中,port用于设置访问地址,username和password用于设置授权认证。
;[inet_http_server]         ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user              ;登录管理后台的用户名
;password=123               ;登录管理后台的密码
 
 # 管理服务本身的配置
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ;可以打开的进程数的最小值,默认 200
 
 
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
 
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=tomcat          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程
 # 对事件进行的管理
;[eventlistener:theeventlistenername]

# 对任务组的管理 ,包含其它配置文件
;[group:thegroupname]
;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
;priority=999                  ; the relative start priority (default 999)

[include]
files = supervisord.d/*.ini    ;可以指定一个或多个以.ini结束的配置文件

2.2 自定义进程配置

注:supervisord.d目录用来存放用户自定义的进程配置

例子:文件 qqc.ini
# 程序名称,在 supervisorctl 中通过这个值来对程序进行一系列的操作
[program:qqc_one]
# 启动命令,与手动在命令行启动的命令是一样的
command=gunicorn wsgi:application -b 0.0.0.0:8000 -k gevent -w 2 -t 10 -n yun-gunicorn -m 0022 --log-level=info --access-logfile=- --error-logfile=- --max-requests=5000
# 程序的启动目录
directory=/home/yun/projects/yun
# 可以通过 environment 来添加需要的环境变量,一种常见的用法是使用指定的 virtualenv 环境
environment=DJANGO_SETTINGS_MODULE=settings.test
# 指定用户名
user=opt
# 日志目录 需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/var/log/supervisor/yun-gunicorn.stdout.log
stderr_logfile=/var/log/supervisor/yun-gunicorn.stderr.log
# 日志备份数量
stdout_logfile_backups = 20
# 指定日志文件大小
stdout_logfile_maxbytes = 20MB 
# 把 stderr 重定向到 stdout,默认 false,错误日志也会写进stdout_logfile中
redirect_stderr=True
# 在 supervisord 启动的时候也自动启动
autostart=True    
# 程序异常退出后自动重启
autorestart=True

[program:qqc_two]
...
[program:qqc_free]
...

# 集中管理多个进程
[group:qqc]
programs=qqc_one,qqc_two,qqc_free
  • 注意: supervisor不能监控后台进程,command 不能为后台运行命令
常用指令:
  • supervisord --nodaemon 前台启动Supervisor服务
  • supervisorctl -i 进入交互式Shell
  • supervisorctl status 查看任务列表
  • supervisorctl status helloworld 查看指定任务的状态
  • supervisorctl stop/start/restart all 结束/启动/重启所有任务
  • supervisorctl stop/start/restart helloworld 结束/启动/重启指定任务
  • supervisorctl reroad 重新加载配置文件,不增减任务
  • supervisorctl update all 重新加载配置文件,并进行必要的增减任务
  • supervisorctl remove/add 移除/添加任务(配置文件中已经存在的任务)
  • supervisorctl tail -f helloworld 实时查看任务的控制台输出
  • supervisorctl tail -f helloworld stderr 实时查看任务的控制台错误输出
  • supervisorctl reload 重启Supervisor服务
  • supervisorctl fg helloworld 将任务拉到前台,此时Ctrl+C不会结束任务,而是将任务放回后台
  • supervisorctl shutdown 终止Supervisor服务
  • supervisorctl clear all 清楚所有进程的日志文件
  • supervisorctl maintail -f 实时查看Supervisor服务的日志文件
  • supervisorctl signal SIGTERM all 结束所有进程
  • supervisorctl signal SIGKILL all 杀死所有进程
  • supervisorctl --serverurl http://localhost:9001 status 管理远程Supervisor服务

安装配置 CeSi

1. 简介

CeSi 是 Supervisor 官方推荐的集中化管理 Supervisor 实例的 Web UI,该工具是用 Python 编写,基于 Flask Web 框架 。

Superviosr 自带的 Web UI 不支持跨机器管理
Supervisor 进程,功能比较简单,通过 CeSi 可以集中管理各个服务器节点的进程,在 Web 界面就可以轻松管理各个服务的启动、关闭、重启等,很方便使用。

2. 安装

网上有很多安装CeSi的教程,都是基于v1.0版本,偶尔的v1.5版本的,而在github上已经更新到v2.6.7版本,所以网上的很多安装办法对v2.6.7根本不适用。
此处只介绍v2.6.7的安装步骤 。

安装 CeSi 有三个依赖:Python,Flask,sqlite3 一般的 Linux 发行版都默认安装了 Python,所以
Python 不需要再次安装; 从 Python 2.5 开始 sqlite3 已经在标准库内置了,所以也不需要安装 sqlite3
模块了; 另外很多 Linux 发行版已经自带 sqlite3,所以无需另外安装; 只需要安装 flask web 框架即可;

具体安装步骤如下:

# 安装依赖 (如果有跳过)
yum install -y git wget epel-release python34 python34-pip npm bzip2

# 设置环境变量并创建安装目录
export CESI_SETUP_PATH=/usr/local/cesi
mkdir ${CESI_SETUP_PATH}
cd ${CESI_SETUP_PATH}

# 下载cesi-2.6.7.tar.gz并解压
wget https://github.com/gamegos/cesi/releases/download/v2.6.7/cesi-extended.tar.gz -O cesi.tar.gz
tar -zxvf cesi.tar.gz

# 创建venv虚拟环境(也可以使用已有的虚拟环境)
python3.4 -m venv venv

# 激活venv虚拟环境
source venv/bin/activate
# 在venv虚拟环境中,使用pip3管道安装依赖
pip3 install -r requirements.txt
# 失效venv虚拟环境
deactivate

############### 此段为可选安装,经本人测试,不建议安装,要安装一大堆东西,然并卵 ############
# (可选安装)升级node到最新版
npm install -g n
n latest
# (可选安装)安装 yarn
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum install -y yarn
# (可选安装)构建ui,需要安装yarn, node, npm
cd ${CESI_SETUP_PATH}/cesi/ui
yarn install
yarn build
#######################################################################################

# 复制配置文件到/etc目录
cp ${CESI_SETUP_PATH}/defaults/cesi.conf.toml /etc/cesi.conf

# 复制服务配置文件到/etc/systemd/system目录,并注册为服务(CentOS7)
cp ${CESI_SETUP_PATH}/defaults/cesi.service /etc/systemd/system/cesi.service

三、CeSi 配置

​ 按上述脚本安装完成后,会生成配置文件在 /etc/cesi.conf,配置文件详细如下(此文件为真实用例):

# This is the main CeSI toml configuration file. It contains CeSI web application and

# supervisord information to connect

# This is the CeSI's own configuration.
[cesi]
# Database Uri
database = "sqlite:///users.db"                         # Relative path
# Etc
#database = "sqlite:opt/cesi/< version >/users.db"  # Absolute path
#database = "postgres://:@localhost:5432/"
#database = "mysql+pymysql://:@localhost:3306/"
activity_log = "activity.log"                           # File path for CeSI logs
admin_username = "admin"                                # Username of admin user
admin_password = "123456"                               # Password of admin user

# This is the definition section for new supervisord node.
# [[nodes]]
# name = "api"          # (String) Unique name for supervisord node.
# environment = ""      # (String) The environment name provides logical grouping of supervisord nodes. It can be used as filtering option in the UI.
# username = ""         # (String) Username of the XML-RPC interface of supervisord Set nothing if no username is configured
# password = ""         # (String) Password of the XML-RPC interface of supervisord. Set nothing if no username is configured
# host = "127.0.0.1"    # (String) Host of the XML-RPC interface of supervisord
# port = "9001"         # (String) Port of the XML-RPC interface of supervisord

# Default supervisord nodes
[[nodes]]
name = "ecs-soms"
environment = "soms"
username = "admin"  #supervisord web 的用户名
password = "123456" #密码
host = "127.0.0.1"
port = "9001"

四、CeSi 启动
  • 网上找的注册为系统服务的脚本启动会失败,经过本人多次尝试,已放弃。
  • 可直接使用如下命令启动,但关闭shell窗口时会结束进程:
/usr/local/cesi/venv/bin/python3 /usr/local/cesi/cesi/run.py --config-file /etc/cesi.conf

CeSi是基于flask框架搭建的,所以启动方式跟flask是一样的,默认端口是5000,如果要更改端口:
-p +端口号 就可以了

/usr/local/cesi/venv/bin/python3 /usr/local/cesi/cesi/run.py --config-file /etc/cesi.conf -p 5023

  • 现直接使用 supervisor 来管理启动 CeSi,具体教程见 Supervisor安装与配置,大致如下:

在 /etc/supervisor.d/ 目录下创建 cesi.conf 文件,并输入如下内容:


[program:cesi]
directory=/usr/local/cesi/cesi
environment=PATH="/root/.virtualenvs/py3_venv/bin/"
command=python run.py -p 5053 --config-file /etc/cesi.conf
autostart=true
startsecs=10
starttries=3
user=root
priority=996
redirect_stderr=false
stdout_logfile=/usr/local/cesi/cesi.log
stderr_logfile=/usr/local/cesi/cesi-err.log
stopasgroup=false
killasgroup=true

加入配置文件后要更新supervisor配置

supervisorltc reload

开启cesi进程

supervisorltc start cesi

五、管理界面
​ CeSi 安装完全后默认开放端口 5000,在浏览器中输入 http://127.0.0.1:5000 打开管理界面如下:
在这里插入图片描述在这里插入图片描述

你可能感兴趣的:(运维,服务器)