supervisor 安装与配置

###注意:
Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (process log may have details)异常。

需要安装两部分,supervisord(服务端)、supervisorctl(客户端)

安装

[root@bogon supervisor-3.3.3]# pip install supervisor
Collecting supervisor
  Downloading supervisor-4.2.4-py2.py3-none-any.whl (749 kB)
     |████████████████████████████████| 749 kB 1.3 MB/s
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg (from supervisor) (33.1.1)
Installing collected packages: supervisor
Successfully installed supervisor-4.2.4
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
[root@bogon supervisor-3.3.3]#

2. 验证:

[root@bogon supervisor-3.3.3]# supervisorctl --help
supervisorctl -- control applications run by supervisord from the cmd line.

Usage: /usr/local/bin/supervisorctl [options] [action [arguments]]

Options:
-c/--configuration FILENAME -- configuration file path (searches if not given)
-h/--help -- print usage message and exit
-i/--interactive -- start an interactive shell after executing commands
-s/--serverurl URL -- URL on which supervisord server is listening
     (default "http://localhost:9001").
-u/--username USERNAME -- username to use for authentication with server
-p/--password PASSWORD -- password to use for authentication with server
-r/--history-file -- keep a readline history (if readline is available)

action [arguments] -- see below

Actions are commands like "tail" or "stop".  If -i is specified or no action is
specified on the command line, a "shell" interpreting actions typed
interactively is started.  Use the action "help" to find out about available
actions.

3. 配置   (生成默认配置文件)

1.创建配置
[root@bogon ~]# mkdir -p /etc/supervisor/conf.d
[root@bogon ~]# echo_supervisord_conf > /etc/supervisord.conf
[root@bogon ~]#

2. 修改配置
  开放配置末尾的include注释,改为:

[root@bogon ~]# vi /etc/supervisord.conf


[include]
files = /etc/supervisor/conf.d/*.ini  ; 打开注释(;),将路径修改为/etc/supervisord/conf.d/

; 这句代码说明它会加载/etc/supervisor/conf.d/ 文件夹中的所有.ini配置文件

3. 去掉[inet_http_server]的注释,使用web查看进程

[root@bogon etc]# pwd
/etc
[root@bogon etc]#
[root@bogon etc]# vi supervisord.conf


去掉注释前:
;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;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=192.168.2.247:9001        ; ip_address:port specifier, *:port for all iface
username=root              ; default is no username (open server)
password=root               ; default is no password (open server)

4.开启端口

在访问其web管理界面之前,先需要开启你为他配置的端口,这里我们分配给他的是9001端口,下面是端口管理的一些命令

1. centos7系统iptables是叫firewalld, 使用systemctl status firewalld查看是否启动。如图表示未运行 
Active:inactive(dead)

[root@bogon ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)    
     Docs: man:firewalld(1)
[root@bogon ~]#
如firewalld 已运行,查询是否开启配置端口号:
firewall-cmd --query-port=9001/tcp          //监测端口是否开启
firewall-cmd --add-port=9001/tcp            //开启9001端口
firewall-cmd --remove-port=9001/tcp       //关闭9001端口
sudo firewall-cmd --reload                  //重新加载配置

supervisor安装完成后会生成两个个执行程序:

supervisortd、supervisorctl和一个配置文件echo_supervisord_conf;

supervisortd: supervisor的守护进程服务(用于接收进程管理命令)

supervisorctl: 客户端(用于和守护进程通信,发送管理进程的指令)

echo_supervisord_conf: 生成初始配置文件程序

#在安装完Supervisor后,会生成两个可执行程序:supervisord和supervisorctl。
#其中,supervisord是Supervisor的守护进程程序,用于启动和管理守护进程。
# supervisorctl是Supervisor的命令行界面程序,用于与Supervisor进行交互,例如启动、停止、重启守护进程等操作。


[root@server-247 etc]#
[root@server-247 etc]# which echo_supervisord_conf
/usr/local/bin/echo_supervisord_conf


[root@server-247 etc]# which supervisord
/usr/local/bin/supervisord


[root@server-247 etc]# which supervisorctl
/usr/local/bin/supervisorctl

启动supervisor  (启动服务端)

[root@bogon etc]#
[root@bogon etc]# supervisord -c /etc/supervisord.conf
[root@bogon etc]#
[root@bogon etc]#
[root@bogon etc]# ps -ef|grep supervisor
root     228196      1  0 20:19 ?        00:00:00 /usr/bin/python3 /usr/local/bin/supervisord -c /etc/supervisord.conf
root     230216 212473  0 20:23 pts/7    00:00:00 grep --color=auto supervisor
[root@bogon etc]#


[root@localhost etc]# supervisorctl
RiskCop_Init_DynServer           RUNNING   pid 15032, uptime 0:00:41
RiskCop_Init_Server              RUNNING   pid 15033, uptime 0:00:41
RiskCop_Init_Web                 RUNNING   pid 15034, uptime 0:00:41
supervisor>
supervisor> exit       # 退出supervisor交互界面

[root@localhost etc]#

  客户端命令 控制监控程序:

[root@localhost etc]# supervisorctl status
RiskCop_Init_DynServer           RUNNING   pid 15032, uptime 0:04:23
RiskCop_Init_Server              RUNNING   pid 15033, uptime 0:04:23
RiskCop_Init_Web                 RUNNING   pid 15034, uptime 0:04:23
[root@localhost etc]#

# 命令 restart program: RiskCop_Init_DynServer  
[root@localhost etc]# supervisorctl restart RiskCop_Init_DynServer
RiskCop_Init_DynServer: stopped
RiskCop_Init_DynServer: started
[root@localhost etc]# 
[root@localhost etc]#


# 关闭某个监控程序    stop program  
[root@localhost ~]#
[root@localhost ~]# supervisorctl stop RiskCop_Init_Server
RiskCop_Init_Server: stopped
[root@localhost ~]#
[root@localhost ~]# supervisorctl
RiskCop_Init_DynServer           STOPPED   Feb 06 03:47 PM
RiskCop_Init_Server              STOPPED   Feb 08 02:00 PM
RiskCop_Init_Web                 RUNNING   pid 15034, uptime 2 days, 2:45:15
supervisor> exit()

[root@localhost ~]#

 客户端 Web 页面控制监控程序:

supervisor 安装与配置_第1张图片

 客户端常用命令如下:



启动客户端supervisorctl,配置完成后重新启动

# 常用命令如下
supervisordctl status 查看进程运行状态
supervisordctl start 进程名 启动进程
supervisordctl stop 进程名 关闭进程
supervisordctl restart 进程名 重启进程
supervisordctl update 重新载入配置文件
supervisordctl shutdown 关闭supervisord
supervisordctl clear 进程名 清空进程日志
supervisordctl 进入到交互模式下。使用help查看所有命令。
start stop restart + all 表示启动,关闭,重启所有进程

浏览器输入:

http://:<端口号>  --> username & pwd

即可登录supervisor web管理页面,界面管理进程

supervisor 安装与配置_第2张图片

5. 配置文件详细解释

; Sample supervisor config file.
 
[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; socket 路径
 
;chmod=0700                 ; socket 文件的权限
;chown=nobody:nogroup       ; socket 所属用户及组
;username=user              ; 用户名
;password=123               ; 密码
 
;[inet_http_server]         ; 是否启用服务,默认是关闭的(启用的话可以看到supervisor 管理的服务状态)
;port=127.0.0.1:9001        ; 监听的IP及端口
;username=user              ; 用户名
;password=123               ; 密码
 
[supervisord]               ; supervisord 全局配置
logfile=/var/log/supervisor/supervisord.log  ; supervisor 日志路径
logfile_maxbytes=50MB       ; 单个日志文件最大数
logfile_backups=10          ; 保留多少个日志文件(默认10个)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; pid 文件路径
nodaemon=false              ; 启动是否丢到前台,设置为false ,表示以daemon 的方式启动
minfds=1024                 ; 最小文件打开数,对应系统limit.conf 中的nofile ,默认最小为1024,最大为4096
minprocs=200                ; 最小的进程打开数,对应系统的limit.conf 中的nproc,默认为200
;umask=022                  ; (process file creation umask;default 022)
;user=chrism                 ; 启动supervisord 服务的用户,默认为root
;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')
;directory=/tmp              ; 这里的目录指的是服务的工作目录
;nocleanup=true              ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value       ; (key value pairs to add to environment)
;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)
 
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 
[supervisorctl]
serverurl=unix:///var/run/supervisor/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
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available
 
; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.
 
;[program:theprogramname]      ; 定义一个守护进程 ,比如下面的elasticsearch 
;command=/bin/cat              ; 启动程序使用的命令,可以是绝对路径或者相对路径
;process_name=%(program_name)s ; 一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s
;numprocs=1                    ; Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1
;directory=/tmp                ; supervisord在生成子进程的时候会切换到该目录
;umask=022                     ; umask for process (default None)
;priority=999                  ; 权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999
;autostart=true                ; 如果设置为true,当supervisord启动的时候,进程会自动启动
;autorestart=true              ; 设置为随 supervisord 重启而重启,值可以是false、true、unexpected。false:进程不会自动重启
;startsecs=10                  ; 程序启动后等待多长时间后才认为程序启动成功,默认是10秒
;startretries=3                ; supervisord尝试启动一个程序时尝试的次数。默认是3
;exitcodes=0,2                 ; 一个预期的退出返回码,默认是0,2。
;stopsignal=QUIT               ; 当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2
;stopwaitsecs=10               ; 在操作系统给supervisord发送SIGCHILD信号时等待的时间
;user=chrism                   ; 如果supervisord以root运行,则会使用这个设置用户启动子程序
;redirect_stderr=true          ; 如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符
;stdout_logfile=/a/path        ; 把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置
;stdout_logfile_maxbytes=1MB   ; 标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
;stdout_logfile_backups=10     ; 标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份
;stdout_capture_maxbytes=1MB   ; 当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
;stdout_events_enabled=false   ; 如果设置为true,当进程在写它的stderr
;stderr_logfile=/a/path        ; 把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true
;stderr_logfile_maxbytes=1MB   ; 错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
;stderr_logfile_backups=10     ; 错误日志轮转备份的数量,默认是10,如果设置为0,则不备份
;stderr_capture_maxbytes=1MB   ; 当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
;stderr_events_enabled=false   ; 如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
;environment=A=1,B=2           ; 一个k/v对的list列表
;serverurl=AUTO                ; 是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url
 
; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.
 #这个地方是自定义一个守护进程
[program:elasticsearch]                       ; 定义一个守护进程 elasticsearch
environment=ES_HOME=/usr/local/elasticsearch  ; 设置ES_HOME 环境变量
user=elk                                      ; 启动elasticsearch 的用户
directory=/usr/local/elasticsearch            ; 进入到这个目录中
command=/usr/local/elasticsearch/bin/elasticsearch ; 执行启动命令
numprocs=1                                    ; Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1
autostart=true                                ; 设置为随 supervisord 启动而启动
autorestart=true                              ; 设置为随 supervisord 重启而重启
startretries=3                                ; 设置elasticsearch 重启的重试次数
priority=1                                    ; 权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999  
 
;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;events=EVENT                  ; event notif. types to subscribe to (req'd)
;buffer_size=10                ; event buffer queue size (default 10)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=-1                   ; the relative start priority (default -1)
;autostart=true                ; start at supervisord start (default: true)
;autorestart=unexpected        ; restart at unexpected quit (default: unexpected)
;startsecs=10                  ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups        ; # of stderr logfile backups (default 10)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A=1,B=2           ; process environment additions
;serverurl=AUTO                ; override serverurl computation (childutils)
 
; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.
 
;[group:thegroupname]          ; 服务组管理,可以将多个服务名写到这里管理(组名自定义)
;programs=progname1,progname2  ; 上面配置好的服务名,比如elasticsearch,kibana,logstash
;priority=999                  ; the relative start priority (default 999)
 
; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.
 
[include]
files = supervisord.d/*.ini  ;默认放在安装目录的supervisord.d目录下,可以指定一个或多个以.ini结束的配置文件。

配置项目

可以配置多个项目配置文件,如项目过可以 分组管理。

[root@localhost ~]# cd /etc/supervisor/conf.d/
[root@localhost conf.d]# ls
RiskcopInitServer.ini  RiskcopInitWeb.ini
[root@localhost conf.d]#
[root@localhost conf.d]#
[root@localhost conf.d]# ll
total 8
-rw-r--r--. 1 root root 773 Oct 24 20:59 RiskcopInitServer.ini
-rw-r--r--. 1 root root 839 Oct 25 09:35 RiskcopInitWeb.ini
[root@localhost conf.d]#
[root@localhost conf.d]#


[root@localhost conf.d]# cat RiskcopInitWeb.ini
[program:RiskCop_Init_Web] #RiskCop_Init_Web  为程序的名称
command=bash -c "lsof -i :8888 |awk 'NR==2{print$2}' |xargs kill -9; python3 manage.py runserver" #需要执行的命令
directory=/home/TestEnv/riskcop/FunctionalTest/Risk_Init/Init_Sys/ #命令执行的目录
user=root #用户
priority=999
stopsignal=INT
autostart=true #是否自启动
startsecs=10 # #指程序启动时需要程序至少稳定运行x秒才认为程序运行正常,在这x秒中程序状态为正在启动(s)
autorestart=true #是否自动重启
startretries=3 # 重启失败拉起次数
#stderr_logfile=/var/log/RiskcopInit_Server.err.log #错误日志文件
#stdout_logfile=/var/log/RiskcopInit_Web.out.log #输出日志文件

redirect_stderr=true
stderr_logfile_maxbytes=20MB
stderr_logfile_backups = 20
stderr_logfile=/etc/supervisor/logs/RiskcopInitWeb.err.log #错误日志文件
stdout_logfile_maxbytes=20MB
stdout_logfile_backups = 20
stdout_logfile=/etc/supervisor/logs/RiskcopInitWeb.out.log #输出日志文件

#stopasgroup=false
#killasgroup=false

[root@localhost conf.d]# 
[root@localhost conf.d]#

单行命令,一般配置文件如下:

[root@bogon conf.d]# pwd
/etc/supervisor/conf.d
[root@bogon conf.d]#
[root@bogon conf.d]# cat RiskcopInitWeb.ini
[program:RiskCop_Init_Web] #RiskCop_Init_Web  为程序的名称
command=python3 manage.py runserver #需要执行的命令
directory=/home/TestEnv/riskcop/FunctionalTest/Risk_Init/Init_Sys/ #命令执行的目录
user=root #用户
priority=999
stopsignal=INT
autostart=true #是否自启动
startsecs=10 # 指程序启动时需要程序至少稳定运行x秒才认为程序运行正常,在这x秒中程序状态为正在启动(s)
autorestart=true #是否自动重启
startretries=3 # 重启失败拉起次数
#stderr_logfile=/var/log/RiskcopInit_Server.err.log #错误日志文件
#stdout_logfile=/var/log/RiskcopInit_Web.out.log #输出日志文件

redirect_stderr=true
stderr_logfile_maxbytes=20MB
stderr_logfile_backups = 20
stderr_logfile=/etc/supervisor/logs/RiskcopInitWeb.err.log #错误日志文件
stdout_logfile_maxbytes=20MB
stdout_logfile_backups = 20
stdout_logfile=/etc/supervisor/logs/RiskcopInitWeb.out.log #输出日志文件

#stopasgroup=false
#killasgroup=false[

修改项目配置文件后,重新加载:

[root@bogon ~]# supervisorctl reload
Restarted supervisord
[root@bogon ~]#
[root@bogon ~]#

查看supervisord.log 日志

[root@bogon ~]# tail -f /tmp/supervisord.log
2022-10-26 11:03:05,346 INFO Included extra file "/etc/supervisor/conf.d/RiskcopInitServer.ini" during parsing
2022-10-26 11:03:05,346 INFO Included extra file "/etc/supervisor/conf.d/RiskcopInitWeb.ini" during parsing
2022-10-26 11:03:05,348 INFO RPC interface 'supervisor' initialized
2022-10-26 11:03:05,349 INFO RPC interface 'supervisor' initialized
2022-10-26 11:03:05,349 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2022-10-26 11:03:05,349 INFO supervisord started with pid 219289
2022-10-26 11:03:06,217 INFO spawned: 'RiskCop_Init_Server' with pid 222024
2022-10-26 11:03:06,222 INFO spawned: 'RiskCop_Init_Web' with pid 222025
2022-10-26 11:03:16,809 INFO success: RiskCop_Init_Server entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)
2022-10-26 11:03:16,809 INFO success: RiskCop_Init_Web entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)

web 管理:

supervisor 安装与配置_第3张图片

 supervisor 相关命令:

Supervisor 相关命令
# 重载supervisor
supervisorctl reload

# 更新supervisor
supervisorctl update

# 查看状态
supervisorctl status

# 启动所有/指定的程序进程
supervisorctl start all/ 
# ProgramName 是只 ini配置文件中的名字,如 Riskcop_Init_Web



 #查看supervisor是否启动成功:

#查看supervisor是否启动成功:

ps -ef|grep supervisord


[root@server-247 etc]# ps -ef|grep supervisord
root     110023  77963  0 17:48 pts/202  00:00:00 grep --color=auto supervisord
root     133275      1  0 Jun15 ?        00:14:53 /usr/bin/python3 /usr/local/bin/supervisord -c /etc/supervisord.conf
[root@server-247 etc]#

将supervisor配置为开机自启动服务 

# 确认 supervisord & supervisorctl 路径位置

[root@server-247 system]# which supervisord
/usr/local/bin/supervisord

[root@server-247 system]# which supervisorctl
/usr/local/bin/supervisorctl
[root@server-247 system]# 


# 创建 supervisord.serivce
[root@server-247 system]# vi /usr/lib/systemd/system/supervisord.service

[Unit]
Description=Supervisor daemon

[Service]
Type=forking
PIDFile=/var/run/supervisord.pid
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl shutdown
ExecReload=/usr/local/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target


# 修改服务文件权限

[root@server-247 system]# ll |grep supervisord.servi*
-rw-r--r--  1 root root  322 Jul 17 17:55 supervisord.service
[root@server-247 system]#
[root@server-247 system]# chmod 766 /usr/lib/systemd/system/supervisord.service
[root@server-247 system]#
[root@server-247 system]# ll |grep supervisord.servi*
-rwxrw-rw-  1 root root  322 Jul 17 17:55 supervisord.service
[root@server-247 system]#

你可能感兴趣的:(1024程序员节,运维,linux)