专栏首页运维之路linux应用服务管理工具(supervisor)

linux应用服务管理工具(supervisor)

注:- 此工具属于“工具-自动化-应急类”

- 官网:http://www.supervisord.org/

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

http://ae.koroglu.org/centralized-supervisor-interface-cesi/

本文分享自微信公众号 - 运维之路(HuashengPeng001),作者:广发证券 彭华盛

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 运维不简单

    好长一段时间没有更新公众号,回忆当初开这个公众号的初衷是为了将工作中一些零散的知识点汇总整合,形成为一个相对完整的知识体系。客观的讲,通过总结一些工作心得,让自...

    彭华盛
  • 组织专业化

    可持续扩展的运维知识体系按“组织、流程、工具”三部份整理,本篇为第一部份“组织”的“运维组织专业化”。

    彭华盛
  • 智能时代下的冷思考:回归ITOA

    运维人员每天面临很多零碎的工作,有各种渠道而来的问题咨询、多个监控工具的报警,以及各种非计划性和计划性的工作,相比于其它工种,运维人员更需要一个综合性的...

    彭华盛
  • 进程监控工具supervisor 启动Mongodb

    进程监控工具supervisor 启动Mongodb 一什么是supervisor Superviosr是一个UNIX-like系统上的进程监控工具。 Supe...

    张善友
  • (Centos7)Supervisor安装部署

    2.配置文件 supervisor安装成功之后,没有提供默认的配置文件,可以通过运行echo_supervisord_conf程序生成supervisor的初始...

    Man_Docker
  • 开始使用PHPUnit

    想试一下单元测试很久了,但是一直没有合适的项目,而且中文网络上的PHPUnit教程要么太旧,要么太乱,所以总也没学会。最近准备把手头的项目重构一下,决定开始使用...

    wangxl
  • 百度三轮面试回来,想和Java程序员分享一下。

    如果要去百度面试的,提前做好充足的准备吧,不然你会败的很惨。下面整理下我从百度三轮面试回来的题目,供你参考! 一,百度一面 1、给一个函数,返回 0 和 1...

    Java技术栈
  • 2018 年,去百度面试 Java 后端的一次面试经历

    1、给一个函数,返回 0 和 1,概率为 p 和 1-p,请你实现一个函数,使得返回 01 概率一样。

    美的让人心动
  • 管理经济学 读书笔记二

    非沉没成本(包括机会成本):固定(规模经济的本质要素)和可变成本;联合(范围经济的实质因素)和非联合成本

    lilugirl
  • REdis MASTER aborted replication NOAUTH Authentication required

    对于REdis集群,如果设置了requirepass, 则一定要设置masterauth,否则从节点无法正常工作,查看从节点日志可以看到哪下内容: 1921...

    一见

扫码关注云+社区

领取腾讯云代金券