小诺文档中心 小诺文档中心
首页
小诺博客 (opens new window)
DevOps
云原生
技术
更多
网址导航
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

kevin

运维界的菜鸟
首页
小诺博客 (opens new window)
DevOps
云原生
技术
更多
网址导航
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 踩坑

  • 技术文章

    • 5年运维经验分享:一个小白走向高级运维工程师之路
    • 10 个免费的服务器监控工具
    • 23个从零成长为运维技术大牛的必备秘诀!
    • IT运维是打杂吗
    • QQ与微信架构的惊天密码
    • Linux系统管理员必备的监控工具
    • 你应当定期更改密码吗
    • 你做过的最有效的提高你的编程水平的一件事
    • 如何打造一个TB级微服务海量日志监控平台
    • 十条远离故障的运维工作经验分享
    • web服务器性能估计
    • 故障发生前我们能做什么?
    • 京东:10万规模容器的实践及运营之道
    • 企业互联网+转型实战:如何进行PB级别数据的架构变迁
    • 如烹小虾: 运维自动化闭环,腾讯是这样做的
    • 使用 supervisor 管理进程
      • 1、supervisor工具
      • Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
        • 1)安装supervisor
        • 2)配置文件介绍
        • 3)supervisorctl 命令介绍
        • 4)注意事项 (坑)
      • 2、事件插件
      • 1)插件:https://github.com/ouqiang/supervisor-event-listener
      • 3、可视化工具
    • 万人规模互联网公司的企业IT基础架构概览
    • 用最少的机器支撑万亿级访问,微博6年Redis优化历程
    • 运维不得不知的 Linux 性能监控、测试、优化工具
    • 运维利器:万能的strace
  • 运维文档

  • 计算机网络

  • 开源应用

  • JAVA应用

  • 技术
  • 技术文章
xiaonuo
2022-06-19
目录

使用 supervisor 管理进程

# 1、supervisor工具

# Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

Supervisor 有两个主要的组成部分:

– supervisord,运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。

– supervisorctl,是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。

supervisor是所有进程的父进程,管理着启动的子进展,supervisor以子进程的PID来管理子进程,当子进程异常退出时supervisor可以收到相应的信号量。

# 1)安装supervisor

安装supervisor

rpm -ivh supervisor-3.0-1.gf.el6.noarch.rpm

#实测过程中,还要安装依赖包:

rpm -ivh python-meld3-0.6.7-1.el6.x86_64.rpm

服务命令:

service supervisord stop service supervisord start

# 2)配置文件介绍

创建配置文件

echo_supervisord_conf > /etc/supervisord.conf

默认下的supervisord.conf配置文件将supervisord.pid 以及 supervisor.sock 放在 /tmp 目录,可能会被 Linux 系统删除的,需要作修改。

[unix_http_server] ;file=/tmp/supervisor.sock ; (the path to the socket file) ;修改为 /var/run 目录,避免被系统删除 file=/var/run/supervisor.sock ;chmod=0700 ; socket file mode (default 0700) ;chown=nobody:nogroup ; socket file uid:gid owner ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server))

;[inet_http_server] ; inet (TCP) server disabled by default ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface) ;在后面远程可视化管理中会用到

username=calypso ; (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) ;修改为 /var/log 目录,避免被系统删除 logfile=/var/log/supervisor/supervisord.log logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) ;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid) ;修改为 /var/run 目录,避免被系统删除 pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) …

[supervisorctl] ;修改为 /var/run 目录,避免被系统删除 serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=chris ; should be same as http_username if set ;password=123 ; should be same as http_password if set

[include] files = /etc/supervisord.d/*.ini ;对应需要管理的进程配置文件

;[eventlistener:theeventlistenername]

;是suopervisor启动的子进程,是订阅supervisord发送的event,比如报警等,后续将写一篇发送事件报警的实践文章

;command=/bin/eventlistener ;listener的可执行文件的路径

;process_name=%(program_name)s ;进程名,当下面的numprocs为多个的时候,才需要。

;numprocs=1 ; 相同的listener启动的个数

;events=EVENT ; event事件的类型,指定类型才会被发送

;buffer_size=10 ; 这个是event队列缓存大小

;directory=/tmp ; 进程执行前,会切换到这个目录下执行默认为不切换。。。非必须

;umask=022 ; 默认为none

;priority=-1 ; 启动优先级,默认-1

;autostart=true ; 是否随supervisord启动一起启动,默认true

;autorestart=unexpected ; 是否自动重启,分true,false,unexpected等

;startsecs=1 ; 也是一样,进程启动后跑了几秒钟,才被认定为成功启动,默认1

;startretries=3 ; 失败最大尝试次数,默认3

;exitcodes=0,2 ; 期望或者说预料中的进程退出码,

;stopsignal=QUIT ; 干掉进程的信号,默认为TERM,比如设置为QUIT,那么如果QUIT来干这个进程那么会被认为是正常维护,退出码也被认为是expected中的

;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)

;stopasgroup=false ; send stop signal to the UNIX process group (default false)

;killasgroup=false ; SIGKILL the UNIX process group (def false)

;user=chrism ;设置普通用户,可以用来管理该listener进程。默认为空

;redirect_stderr=true ; 为true的话,stderr的log会并入stdout的log里面默认为false

……

;[group:thegroupname] ;programs分组

;programs=progname1,progname2 ; 组成员,用逗号分开这个是个必须的设置项

;priority=999 ; 优先级,相对于组和组之间说的默认999

进程配置文件

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名

[program:calypso_api] command=/calypso/envs/GFSCalypsoAdapters/API/scripts/gfs_calypso_api_service.sh start directory=/calypso/envs/GFSCalypsoAdapters/API/scripts/ ; 执行 command 之前,先切换到目录 numprocs=1 ; 默认为1

process_name=%(program_name)s ; 默认为 %(program_name)s,即 [program:x] 中的 x user=calypso ; 使用 calypso 用户来启动该进程 #autostart=true autorestart=true ; 程序崩溃时自动重启,重启次数是有限制的,默认为3次,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的 environment=PATH=”/usr/java/jdk1.7.0_21/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/dell/srvadmin/bin:/opt/mqm/samp/bin” ; 设置环境变量 redirect_stderr=true stdout_logfile=/var/log/calypso_api_stdout.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stdout_events_enabled=false stderr_logfile=/var/log/calypso_api_stderr.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB stderr_events_enabled=false

# 3)supervisorctl 命令介绍

# 停止某一个进程,program_name 为 [program:x] 里的 x supervisorctl stop program_name # 启动某个进程 supervisorctl start program_name # 重启某个进程 supervisorctl restart program_name # 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理) supervisorctl stop groupworker: # 结束 groupworker:name1 这个进程 (start,restart 同理) supervisorctl stop groupworker:name1 # 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件 supervisorctl stop all # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程 supervisorctl reload # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启 supervisorctl update

# 4)注意事项 (坑)

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

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

# 2、事件插件

# 1)插件:https://github.com/ouqiang/supervisor-event-listener

supervisor-event-listener,Supervisor事件通知, 支持邮件, Slack, WebHook

2)网上有一个事件例子(附例子)http://www.cnblogs.com/felixzh/p/6100000.html

过阵子专门写一篇这块的整理

# 3、可视化工具

默认的工具只能管理一个进程,如果在公司统一使用,需要找一个可以统一管理所有进程的工具,官网推荐了几个可视化工具: -CESI

#

#

以Python编写的基于Web的仪表板。

– Django的Dashvisor

以Python编写的基于Web的仪表板。需要Django 1.3或1.4。

– Nodervisor

在Node.js中编写的基于Web的仪表板

– Supervisord监视器

基于Web的仪表板用PHP编写。

– SupervisorUI

另一个使用PHP编写的基于Web的仪表板。

– supervisorclusterctl

使用Ansible控制多个Supervisor实例的命令行工具。

– suponoff

以Python 3编写的基于Web的仪表板。需要Django 1.7或更高版本。

– Supvisors

专为分布式应用程序而设计,以Python 2.7编写。包括扩展的XML-RPC API和基于Web的仪表板。

实测试用,其中CESI不错,推荐使用。程序来源:https://github.com/Gamegos/cesi

Centralized Supervisor Interface: Cesi (opens new window)

可视化工具

如烹小虾: 运维自动化闭环,腾讯是这样做的
万人规模互联网公司的企业IT基础架构概览

← 如烹小虾: 运维自动化闭环,腾讯是这样做的 万人规模互联网公司的企业IT基础架构概览→

最近更新
01
postgresql安装
06-24
02
oracle笔记
06-24
03
opengauss笔记
06-24
更多文章>
Theme by Vdoing | Copyright © 2019-2022 kevin | 小诺运维
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×