一、安装 Supervisor

pip install supervisor

使用 echo_supervisord_conf 命令生成默认配置文件

echo_supervisord_conf > /etc/supervisord.conf

配置文件说明

位置: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=192.168.2.111: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 = /etc/supervisord.d/*.ini    ;可以指定一个或多个以.ini结束的配置文件

注意最后行,代表我们将其他配置的supervisor文件放在/etc/supervisord.d 目录下,名称为 *.ini

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

inet_http_server 也要放开,下面cesi服务需要调用该接口

[inet_http_server]         ;HTTP服务器,提供web管理界面
port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
username=user              ;登录管理后台的用户名
password=123               ;登录管理后台的密码

 

手动创建目录

mkdir /etc/supervisord.d

自定义配置文件

[root@test111 supervisord.d]# cat ho-monitor.ini 
[program:cesi-5000] 
; program 表示 Supervisor 管理的服务实例,cesi-5000 是自己命名的服务名称,名字可以随便其,我为了方便管理统一命名为:服务名称-端口
directory = /home/jast/monitor-1.0-SNAPSHOT
; 程序的启动目录
command = java -cp /home/jast/ho-monitor-1.0-SNAPSHOT/lib/*:/home/jast/ho-monitor-1.0-SNAPSHOT/ho-monitor-1.0-SNAPSHOT.jar  com.monitor.test111
; 启动服务的命令
priority=1                    
; 数字越高,优先级越高
autostart = true     
; 在 supervisord 启动的时候也自动启动
startsecs = 5        
; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true   
; 程序异常退出后自动重启
startretries = 3     
; 启动失败自动重试次数,默认是 3
user = root      
; 用哪个用户启动
redirect_stderr = true  
; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB  
; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 7 
; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/monitor/stdout.log

如果要将一个程序启动多个进程则需加入配置

;启动进程数量
numprocs = 5
;当进程数量numprocs大于1是需要定义process_name
process_name=%(program_name)s_%(process_num)002d

 启动五个进程Demo

[root@test111 supervisord.d]# cat ho-monitor.ini 
[program:cesi-5000] 
; program 表示 Supervisor 管理的服务实例,cesi-5000 是自己命名的服务名称,名字可以随便其,我为了方便管理统一命名为:服务名称-端口
directory = /home/jast/monitor-1.0-SNAPSHOT
; 程序的启动目录
command = java -cp /home/jast/ho-monitor-1.0-SNAPSHOT/lib/*:/home/jast/ho-monitor-1.0-SNAPSHOT/ho-monitor-1.0-SNAPSHOT.jar  com.monitor.test111
;启动进程数量
numprocs = 5
;当进程数量numprocs大于1是需要定义process_name
process_name=%(program_name)s_%(process_num)002d
; 启动服务的命令
autostart = true     
; 在 supervisord 启动的时候也自动启动
startsecs = 5        
; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true   
; 程序异常退出后自动重启
startretries = 3     
; 启动失败自动重试次数,默认是 3
user = root      
; 用哪个用户启动
redirect_stderr = true  
; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB  
; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 7 
; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/monitor/stdout.log

配置参数具体说明:

- command:启动程序使用的命令,可以是绝对路径或者相对路径 - process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s - numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1 - numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值 - priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999 - autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。 - autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。 - startsecs:程序启动后等待多长时间后才认为程序启动成功 - startretries:supervisord尝试启动一个程序时尝试的次数。默认是3 - exitcodes:一个预期的退出返回码,默认是0,2。 - stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。 - stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间 - stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组 - killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。 - user:如果supervisord以root运行,则会使用这个设置用户启动子程序 - redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。 - stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。 - stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true - stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - environment:一个k/v对的list列表 - directory:supervisord在生成子进程的时候会切换到该目录 - umask:设置进程的umask - serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url

 

启动服务

supervisord -c /etc/supervisord.conf

 访问安装的 http://ip:9001 ,成功

Linux 系统进程守护工具 cesi + superviosr_python

安装Cesi

安装依赖

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

#如果提示python34无法安装则进行源执行下面命令
yum -y install epel-release


# 设置环境变量并创建安装目录
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.conf文件

> vim /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://<user>:<password>@localhost:5432/<database_name>"
#database = "mysql+pymysql://<user>:<password>@localhost:3306/<database_name>"
activity_log = "activity.log"   # File path for CeSI logs
admin_username = "admin"        # Username of admin user 这里是cesi的登陆账号密码
admin_password = "admin"        # 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 ,这里连接的是我们的supervisor 的ip、端口、账号、密码
[[nodes]]
name = "192.168.2.111"
environment = ""
username = "user"
password = "123"
host = "192.168.2.111"
port = "9001"

手动启动cesi服务

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

# 指定端口号启动
/usr/local/cesi/venv/bin/python3 /usr/local/cesi/cesi/run.py --config-file /etc/cesi.conf -p 5023

我们可以使用supervisor配置启动该服务

 

vim /etc/supervisord.d/cesi.ini
[program:cesi]
directory=/usr/local/cesi/cesi
command=/usr/local/cesi/venv/bin/python3 /usr/local/cesi/cesi/run.py --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

 重新加载配置

supervisorctl reload

 重启cesi服务

supervisorctl restart cesi

 查看页面发现成功启动

Linux 系统进程守护工具 cesi + superviosr_日志文件_02

注意事项:

1.配置的日志存放目录要存在

Error: The directory named as part of the path /var/log/monitor/stdout.log does not exist in section 'program:cesi-5000' (file: '/etc/supervisord.d/monitor.ini')
For help, use /bin/supervisord -h

2.每次修改配置文件时候需要执行reload才能是配置生效

supervisorctl reload