Supervisor离线安装、管理

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

Supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。

因为Supervisor是Python开发的,安装前先检查一下系统否安装了Python2.4以上版本。下面以CentOS7,Python2.7版本环境下,介绍Supervisor的安装与配置步聚:

离线安装

由于不能连接外网,所以通过离线安装方式安装详见:http://www.supervisord.org/installing.html#installing-to-a-system-without-internet-access

安装supervisor的之前需要安装两个依赖

setuptools: https://pypi.python.org/pypi/setuptools.

meld3:https://pypi.python.org/pypi/meld3.

安装方法都是解压、cd、python setup install

下载supervisor:https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz

安装方法同上:解压、cd、python setup install

生成配置文件:echo_supervisor_conf > /etc/supervisor/supervisord.conf

配置文件参数说明

supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档(http://www.supervisord.org/configuration.html)介绍。
注:分号(;)开头的配置表示注释

1 1 [unix_http_server] 2 2 file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用 3 3 ;chmod=0700 ;socket文件的mode,默认是0700 4 4 ;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid 5 5 6 6 ;[inet_http_server] ;HTTP服务器,提供web管理界面 7 7 ;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性 8 8 ;username=user ;登录管理后台的用户名 9 9 ;password=123 ;登录管理后台的密码 1010 1111 [supervisord] 1212 logfile=/tmp/supervisord.log ;日志文件,指向记录supervisord进程的log文件,默认是 $CWD/supervisord.log 1313 logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小 1414 logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份 1515 loglevel=info ;日志级别,默认info,其它: debug,warn,trace 1616 pidfile=/tmp/supervisord.pid ;pidfile保存子进程的路径,pid 文件 1717 nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动 1818 minfds=1024 ;可以打开的文件描述符的最小值,默认 1024 1919 minprocs=200 ;可以打开的进程数的最小值,默认 200 2020 2121 [supervisorctl] 2222 serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致 2323 ;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord 2424 2525 ; [program:xx]是被管理的进程配置参数,xx是进程的名称 2626 [program:xx] 2727 command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令 2828 autostart=true ; 在supervisord启动的时候也自动启动 2929 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为13030 autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 3131 startretries=3 ; 启动失败自动重试次数,默认是3 3232 user=tomcat ; 用哪个用户启动进程,默认是root 3333 priority=999 ; 进程启动优先级,默认999,值小的优先启动 3434 redirect_stderr=true ; 把stderr重定向到stdout,默认false 3535 stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB 3636 stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 3737 ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件) 3838 stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out 3939 stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 4040 killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程 4141 4242 ;包含其它配置文件 4343 [include] 4444 files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件

include示例:

1[include] 2files = /opt/absolute/filename.ini /opt/absolute/*.ini foo.conf config??.ini

配置进程管理

进程管理配置参数,不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在include指定的目录下包含进supervisord.conf文件中。
1> 创建/etc/supervisor/config.d目录,用于存放进程管理的配置文件
2> 修改/etc/supervisor/supervisord.conf中的include参数,将/etc/supervisor/conf.d目录添加到include中

11 [include] 22 files = /etc/supervisor/config.d/*.ini

下面是配置Tomcat进程的一个例子:

1[program:tomcat] 2command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run 3stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out 4autostart=true 5autorestart=true 6startsecs=5 7priority=1 8stopasgroup=true 9killasgroup=true

启动Supervisor服务

supervisord -c /etc/supervisor/supervisord.conf

控制进程

supervisord启动成功后,可以通过supervisorctl客户端控制进程,启动、停止、重启。运行supervisorctl命令,不加参数,会进入supervisor客户端的交互终端,并会列出当前所管理的所有进程。

上图中的tomcat就是我们在配置文件中[program:tomcat]指定的名字。

输入help可以查看可以执行的命令列表,如果想看某个命令的作用,运行help 命令名称,如:help stop

11 supervisord -c supervisor.conf 通过配置文件启动supervisor 22 supervisorctl -c supervisor.conf status 查看状态 33 supervisorctl -c supervisor.conf reload 重新载入配置文件 44 supervisorctl -c supervisor.conf start [all]|[x] 启动所有/指定的程序进程 5 supervisorctl -c supervisor.conf stop [all]|[x] 关闭所有/指定的程序进程

Web管理界面

 出于安全考虑,默认配置是没有开启web管理界面,需要修改supervisord.conf配置文件打开http访权限,将下面的配置:

11 ;[inet_http_server] ; inet (TCP) server disabled by default 22 ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface) 33 ;username=user ; (default is no username (open server)) 44 ;password=123 ; (default is no password (open server))

修改成:

11 [inet_http_server] ; inet (TCP) server disabled by default 22 port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface) 33 username=user ; (default is no username (open server)) 44 password=123 ; (default is no password (open server))

开机启动Supervisor服务

1> 进入/lib/systemd/system目录,并创建supervisor.service文件

1 1 [Unit] 2 2 Description=supervisor 3 3 After=network.target 4 4 5 5 [Service] 6 6 Type=forking 7 7 ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf 8 8 ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown 9 9 ExecReload=/usr/bin/supervisorctl $OPTIONS reload 1010 KillMode=process 1111 Restart=on-failure 1212 RestartSec=42s 1313 1414 [Install] 1515 WantedBy=multi-user.target

2> 设置开机启动

11 systemctl enable supervisor.service 22 systemctl daemon-reload

3> 修改文件权限为766

1 chmod 766 supervisor.service

配置service类型服务

1 1 #!/bin/bash 2 2 # 3 3 # supervisord This scripts turns supervisord on 4 4 # 5 5 # Author: Mike McGrath <mmcgrath@redhat.com> (based off yumupdatesd) 6 6 # 7 7 # chkconfig: - 95 04 8 8 # 9 9 # description: supervisor is a process control utility. It has a web based 1010 # xmlrpc interface as well as a few other nifty features. 1111 # processname: supervisord 1212 # config: /etc/supervisor/supervisord.conf 1313 # pidfile: /var/run/supervisord.pid 1414 # 1515 1616 # source function library 1717 . /etc/rc.d/init.d/functions 1818 1919 RETVAL=0 2020 2121 start() { 2222 echo -n $"Starting supervisord: " 2323 daemon "supervisord -c /etc/supervisor/supervisord.conf " 2424 RETVAL=$? 2525 echo 2626 [ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord 2727 } 2828 2929 stop() { 3030 echo -n $"Stopping supervisord: " 3131 killproc supervisord 3232 echo 3333 [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/supervisord 3434 } 3535 3636 restart() { 3737 stop 3838 start 3939 } 4040 4141 case "$1" in 4242 start) 4343 start 4444 ;; 4545 stop) 4646 stop 4747 ;; 4848 restart|force-reload|reload) 4949 restart 5050 ;; 5151 condrestart) 5252 [ -f /var/lock/subsys/supervisord ] && restart 5353 ;; 5454 status) 5555 status supervisord 5656 RETVAL=$? 5757 ;; 5858 *) 5959 echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" 6060 exit 1 6161 esac 6262 6363 exit $RETVAL

将上述脚本内容保存到/etc/rc.d/init.d/supervisor文件中,修改文件权限为755,并设置开机启动

11 chmod 755 /etc/rc.d/init.d/supervisor 22 chkconfig supervisor on

注意:修改脚本中supervisor配置文件路径为你的supervisor的配置文件路径

其它Linux发行版开机启动脚本https://github.com/Supervisor/initscripts

注意:

Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (process log may have details)异常。例子中的Tomcat默认是以守护进程启动的,所以我们改成了catalina.sh run,以前台进程的方式运行。

yum方式安装

supervisor没有发布在标准的CentOS源,需要安装epel源。这种方式安装的可能不是最新版本,但比较方便,安装完成之后,配置文件会自动帮你生成。

默认配置文件:/etc/supervisord.conf
进程管理配置文件放到:/etc/supervisord.d/目录下即可

默认日志文件:/tmp/supervisord.log,可以查看进程的启动信息

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )