使用Supervisor来守护我们的服务

一、Supervisor简介

Supervisor是什么?Supervisor官网(http://supervisord.org/)上是这样描述的:Supervisor是一个进程控制系统,可以用来监视并控制类 UNIX 系统上服务的进程。

Supervisor能做什么?当服务进程意外停止时,能让服务自动完成重启,确保服务一直处于运行状态。

Supervisor能解决什么问题?可以将生产中需要长期运行且运行模式是非守护进程(daemonize)的服务托管在Supervisor上,如自研发的C、java、python等服务进程以及用于监控收集数据的服务进程都可以交由Supervisor来管理。

二、安装并启动Supervisor

1、Supervisor的rpm包位于epel源中,所以安装supervisor前需要先安装epel-release

# yum -y install epel-release

# yum -y install supervisor

2、启动supervisor,并设置开机自启。

# systemctl restart supervisord # 该命令用于重启supervisor以及由supervisor管理的所有服务进程。

# systemctl enable supervisord

3、Supervisor的使用,supervisor仅提供了2个可执行文件,这样更容易上手。

第一个:/usr/bin/supervisord,用于启动 Supervisor 服务。

# supervisord -c /etc/supervisor/supervisord.conf  

使用rpm包安装Supervisor可以被系统守护进程(Systemd)来管理,随系统启动而启动。

第二个:supervisorctl,用于启动Supervisor的命令行会话窗口(类似shell),来管理服务进程。

 

三、配置文件/etc/supervisord.conf 介绍

supervisord.conf使用了Windows INI风格,每段以[xx]开头,段内配置均为键/值对。

[unix_http_server]

file=/var/run/supervisor/supervisor.sock   ;socket 路径

chmod=0700                 ; supervisor.sock 文件权限,默认为0700

;chown=nobody:nogroup   ; supervisor.sock文件属主和属组,默认由root:root

username=admin    ;使用supervisorctl登录到supervisord cmd会话窗口的用户,默认不需要用户名

password=1235    ; 使用supervisorctl登录到supervisord cmd窗口的密码(支持明文和SHA),supervisorctl -uadmin -p1235

[inet_http_server]         ; 该段配置用于提供一个HTTP的WEB控制台,用于WEB界面管理服务进程,默认不开启

port=0.0.0.0:9001        ; 监控的IP:端口,使用*:9001表示监听所有接口上的9001端口

username=admin        ;用于登录到WEB控制台的用户名,默认没有设置用户名

password=1234           ; 用于登录到WEB控制台的密码,默认没有设置密码

 

[supervisord]

logfile=/var/log/supervisor/supervisord.log  ; 日志存放路径

logfile_maxbytes=50MB       ;日志达50MB后滚动,默认值50MB

logfile_backups=10          ;保留10个supervisord.log日志,默认值10

loglevel=info               ;日志级别,默认配置为info; 可配置为debug、warn、trace

pidfile=/var/run/supervisord.pid ; 进程文件路径

nodaemon=false              ; supervisord进程是否在前台启动;默认为false,表示后台启动

minfds=1024                 ; 启动supervisord前可用的最小文件描述符数为1024,即/etc/security/limits.conf中nofile设置要大于1024,否则用普通用户将无法启动supervisord

minprocs=200                ; 启动supervisord前,最小可用procs不能小于200,即/etc/security/limits.conf中nproc设置要大于200,否则用普通用户将无法启动supervisord

umask=022                  ;supervisord进程文件的umask,默认为022

;user=chrism                 ; supervisord进程用户,默认为root

;identifier=supervisor       ;管理器进程的标识符,给RPC接口使用,默认为supervisor

;directory=/tmp              ; 启动时不用cd到当前目录

;nocleanup=true              ; 阻止supervisord在启动时清除任何现有的日志文件,默认为false

;childlogdir=/tmp            ; 用于自动子日志文件的目录,默认值取的是python的tempfile.get_tempdir()方法

;environment=KEY=value       ; 用于定义环境变量,以键值对的方式

;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)

 

[supervisorctl]

serverurl=unix:///var/run/supervisor/supervisor.sock ; 使用unix套接字方式

;username=admin     ; 如果设置,需和http_username一样,但实际测试验证设与不设置均不影响supervisorctl

;password=1234       ; 如果设置,需和http_password一样,但实际测试验证设与不设置均不影响supervisorctl

prompt=mysupervisor      ;进入supervisord会话窗口后的命令提示符

history_file=~/.sc_history  ; 使用supervisorctl进入supervisord会话窗口后,操作命令均保存在该文件内

 

;[program:cat]             ;冒号后的cat为服务名称,也可以是prometheus、node_exporter等

;command=/bin/cat   ;服务启动的命令

;process_name=%(program_name)s  ;一个使用Python字符串的表达式,用来描述进程名称(字符串),默认设置

;numprocs=1   ;默认为1,如果>1,则process_name表达式必须包含%(process_num)s,或包含process_num的任何其他有效Python字符串表达式

;directory=/tmp      ;应用目录,可不设置

;umask=022            ;掩码,按默认设置

;priority=999           ;优先级越高,表示最先关闭,最晚启动,默认为999

;autostart=true       ;是否自启动

;autorestart=unexpected  ;当进程处于运行状态时,如果该进程退出,则是否应自动重新启动该进程。如果设置为false,则不会自动重新启动进程。如果设置为unexpected,当程序退出时,退出代码不是与此进程配置相关联的退出代码之一(请参阅退出代码),则将重新启动进程。如果设置为true,则进程在退出时将无条件重新启动,而不考虑其退出代码

;startsecs=10  ;服务启动后需要保持运行多少秒才认为启动成功,如10秒仍处理运行状态则表示启动成功。

;startretries=3   ;尝试启动次数

;exitcodes=0    ;退出代码,默认为0,该值设置会影响到autorestart

;stopsignal=TERM   ;停止信号,可以是TERM, HUP, INT, QUIT, KILL, USR1, or USR2

;stopwaitsecs=10    ;停止时等待多少秒

;stopasgroup=false                   ;向进程组发送停止信号,这止进程

;killasgroup=false                      ;向进程组发送SIGKILL终止进程

;user=chrism                              ;启动用户

;redirect_stderr=false                 ;标准错误输出是否重定向,若设置为true,则表示将错误输出重定向到标准出日志文件中

;stdout_logfile=/a/path              ;标准输出日志文件路径

;stdout_logfile_maxbytes=1MB  ;单个日志文件大小,超出将滚动

;stdout_logfile_backups=10       ;保留日志个数

;stderr_logfile=/a/path              ;标准错误输出日志文件位置,redirect_stderr=false才有效

;stderr_logfile_maxbytes=1MB  ;标准错误输出单个日志文件大小,超出将滚动redirect_stderr=false才有效

;stderr_logfile_backups=10       ;保留标准错误输出日志文件个数,超出删除,edirect_stderr=false才有效

 

[include]    ;将各应用配置分别存放于supervisord.d下,便于管理。

files = supervisord.d/*.ini

 

四、通常,各个服务配置放在supervisord.d目录下,每个服务一个配置文件,此处以prometheus和node_exporter进程为例,具体配置如下。

# cat /etc/supervisord.d/prometheus.ini  

[program:prometheus]    ;应用名称为:prometheus  

command=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus --storage.tsdb.retention=90d     ;应用启动命令

user=root            ;以root用户启动

autostart=true     ;允许自启动 

autorestart=true  ;进程退出时自动重启

startsecs = 5        ;启动后运行5s后进程仍存在将被认为服务启动成功

exitcodes=0        ;退出码

redirect_stderr=true     ;标准错误输出重定向到标准输出 

stdout_logfile=/var/log/prometheus.log   ;日志文件路径

stdout_logfile_backups=5                         ;日志文件保留个数

 

# cat /etc/supervisord.d/node_exporter.ini  

[program:node_exporter]

directory=/usr/local/node_exporter

command=/usr/local/node_exporter/node_exporter

user=root

autostart=true

autorestart=true

startsecs = 5

redirect_stderr=true

stdout_logfile=/var/log/prometheus.log

stdout_logfile_backups=5

 

登录 http://ip:9001,按[inet_http_server] 中配置,用户名为admin,密码为1234,服务运行状态如下图所示。

使用supervisorctl命令登录到supervisord会话窗口来管理进程,

使用help命令查看帮助

常用的操作命令包括:status(查看状态)、stop(stop xx 停止xx服务)、start(start xx 启动xx服务)、reread(热加载配置)、update 等

mysupervisor> status

node_exporter                    RUNNING   pid 5339, uptime 0:00:21

prometheus                       RUNNING   pid 5340, uptime 0:00:21

mysupervisor> stop node_exporter

node_exporter: stopped

mysupervisor> status

node_exporter                    STOPPED   May 12 10:12 PM

prometheus                       RUNNING   pid 5340, uptime 0:00:31

mysupervisor> start node_exporter

node_exporter: started

mysupervisor> status

node_exporter                    RUNNING   pid 5362, uptime 0:00:04

prometheus                       RUNNING   pid 5340, uptime 0:00:40

mysupervisor> update #有新增或修改配置时,我们可以使用update命令来更新配置

mysupervisor> reread

上述操作是在supervisord会话中交互式执行,也可使用supervisorctl 命令直接对服务做停止或启动操作

 

# supervisorctl -uadmin -p1235 start node_exporter

# supervisorctl -uadmin -p1235 status 

# supervisorctl -uadmin -p1235 reread

总结:有了Supervisor,再也不用自己去写守护进程脚本了,一般监控用的agent均可使用Supervisor来管理

posted @ 2022-08-03 14:26  leiuk  阅读(292)  评论(0编辑  收藏  举报