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

一、安装 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 ,成功

安装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

 查看页面发现成功启动

注意事项:

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Delta3d组件以及消息机制

在游戏管理器&#xff08;GameManager&#xff09;中维护一个消息队列std::queue(mSendMessageQueue),在GameManager::SendMessage中将消息放入队列中&#xff0c;如下 void GameManager::SendMessage(const Message& message){mGMImpl->mSendMessageQueue.push(dtCore:…

集合类三种遍历方式

package com.test;import java.util.ArrayList; import java.util.Iterator;//集合三种遍历方式 /** iterator的操作是有限的&#xff0c;只能对元素进行判断、取出、删除操作* 如果进行其他操作用ListIterator* */ public class Array_list {public static void main(String[]…

顺序表应用6:有序顺序表查询

题目描述 顺序表内按照由小到大的次序存放着n个互不相同的整数&#xff08;1<n<20000)&#xff0c;任意输入一个整数&#xff0c;判断该整数在顺序表中是否存在。如果在顺序表中存在该整数&#xff0c;输出其在表中的序号&#xff1b;否则输出“No Found!"。输入 第…

Docker 服务器安装(一)

使用官方安装脚本自动安装 安装命令如下&#xff1a; curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 也可以使用国内 daocloud 一键安装命令&#xff1a; curl -sSL https://get.daocloud.io/docker | sh 设置docker 加速器 sudo curl -sSL https…

游戏入口点GameEntryPoint

GameStart 通过在我们的库中查找入口点类来调用相应的接口启动我们的应用程序。一旦它找到了入口点&#xff0c;它会调用三个函数来替换掉它自己的应用转向执行我们的游戏循环。游戏入口点对于 GameStart 来说就像ActorPluginRegistry 对于 ActorLibrary 一样。游戏入口点有以下…

Docker 入门使用 (二)

配置国内的源 > /etc/docker/daemon.json{"registry-mirrors" : ["https://mirror.ccs.tencentyun.com","http://registry.docker-cn.com","http://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],"…

顺序表应用5:有序顺序表归并

题目描述 已知顺序表A与B是两个有序的顺序表&#xff0c;其中存放的数据元素皆为普通整型&#xff0c;将A与B表归并为C表&#xff0c;要求C表包含了A、B表里所有元素&#xff0c;并且C表仍然保持有序。输入 输入分为三行&#xff1a;第一行输入m、n&#xff08;1<m,n<100…

Delta3d角色注册机制

角色注册主要通过继承自类dtDAL::ActorPluginRegistry类来实现&#xff0c;重写其中的RegisterActorTypes()即可&#xff1b;在对象工厂ObjectFactory中保存了“角色类型到负责创建角色对象的全局函数”的Map&#xff1b; 关键函数有&#xff1a; dtCore::RefPtr<BaseActor…

Docker 使用Dockerfile构建自己的docker服务(三)

先介绍一下DockerFile文件的一些指令说明 DockerFile的指令 FROM 基础镜镜像&#xff0c;一切从这里开始构建 MAINTAINER 镜像是谁写的&#xff0c;姓名邮箱 RUN 镜像构建的时候需要运行的$令 ADD 步骤&#xff0c;tomcat镜像&#xff0c; 这个tomcat压缩包!添加内容 WORKDI…

数据结构实验之栈一:进制转换

题目描述 输入一个十进制整数&#xff0c;将其转换成对应的R&#xff08;2<R<9)进制数,并输出。输入 第一行输入需要转换的十进制数&#xff1b;第二行输入R。输出 输出转换所得的R进制数。示例输入 1279 8 示例输出 2377 #include <stdio.h> #include <stdlib.…

Delta3d动态角色层

DAL 采用一种灵活的、非侵入式的机制来暴露游戏角色的属性信息。 其中两大基础组件就是角色代理和角色属性。角色代理组件就是对底层游戏角色的一个封装&#xff0c;维护单个游戏角色的所有属性信息。而属性组件通过提供对单个游戏角色的所有属性的属性数据访问器来暴露角色的属…

Hbase Shell Filter 过滤

Get 和 Scan 操作都可以使用过滤器来设置输出的范围&#xff0c;类似于 SQL 里面的 Where 查询条件。使用 show_filters 命令可以查看当前 HBase 支持的 过滤器类型。 show_filters使用过滤器的语法格式&#xff1a; scan 表名,{Filter > ”过滤器(比较运算符,’比较器’)…

equals 和 == 的区别?知乎转载

作者&#xff1a;知乎用户 链接&#xff1a;https://www.zhihu.com/question/26872848/answer/34364603 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 简单易懂 Java 语言里的 equals方法其实是交给开发者去覆写…

ElasticSearch sql 插件安装

PS&#xff1a;6.3 开始 ElasticSearch 自身已经支持SQL查询。 github地址&#xff1a;https://github.com/NLPchina/elasticsearch-sql 一、在线安装 直接执行 ./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/6.3.…

Delta3d组件机制

dtGame::GMComponent主要用于处理系统中的消息&#xff0c;给系统动态的添加功能&#xff0c;增加系统的可维护性&#xff0c; 简单来说&#xff0c;一个游戏管理器组件就是一个由游戏管理器管理的可以处理和发送消息的对象。它不像游戏角色&#xff0c;游戏管理器组件接受系统…

zookpeer实现对服务器动态上下线的监听

服务器动态上下线程序的工作机制 服务器代码&#xff1a; 补充&#xff1a;volatile关键字&#xff1a;java中一切都是对象&#xff0c;当多个线程操作同一个对象时候&#xff0c;该对象会放在堆内存中&#xff0c;而多个线程相当于在多个栈中&#xff0c;当A线程想要去除对…

ElasticSearch6.x 7.x Elasticdump 在线安装、离线安装

官网&#xff1a;elasticdump - npm ElasticDump是一个ElasticSearch的数据导入导出开源工具包&#xff0c;方便使用。 官方地址&#xff1a;官方地址&#xff1a;https://github.com/taskrabbit/elasticsearch-dump 一. 安装npm&#xff0c;node # 下载安装包 wget https:/…

用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C对象的各种方法、第三方库和原理&#xff0c;学习了LuaBridge库为Lua绑定C/C对象&#xff0c;下面是学习笔记&#xff0c;实质是对该库的 Reference Manual 基本上翻译了一遍&#xff0c;学习过程中测试代码&#xff0c;放在 我的github 上。 LuaBridge的…

H5动画制作流程没写完。。。

通过 keyframes 规则&#xff0c;您能够创建动画。创建动画的原理是&#xff0c;将一套 CSS 样式逐渐变化为另一套样式。在动画过程中&#xff0c;您能够多次改变这套 CSS 样式。以百分比来规定改变发生的时间&#xff0c;或者通过关键词 "from" 和 "to"&a…

串的基本操作

#include <iostream> #include <algorithm> #include <cstring> #define sqtrmax 1000 using namespace std; typedef struct { char *data; int length; } sqtr; void StrAssign (sqtr &S, char *chars); //赋值 void Destroy(sq…