linux部署_supervisor_开源的进程管理工具

蛋蛋 2024年07月24日 40 0

supervisor的优缺点

Supervisor 是一个开源的进程管理工具,广泛用于管理和监控进程,尤其是在生产环境中。它通过一个统一的界面提供了启动、停止、重启和监控进程的功能。下面是 Supervisor 的一些主要优缺点:

优点

  • 易于配置和使用:
    Supervisor 的配置文件使用 INI 格式,简单明了,易于编写和理解。
    提供了使用命令行工具 supervisorctl 来管理进程的简单方法。

  • 自动重启进程:
    Supervisor 可以配置为在进程崩溃或意外退出时自动重启,确保服务高可用。

  • 日志管理:
    可以配置日志路径,自动管理标准输出和标准错误日志文件,方便问题排查和监控。

  • 进程组管理:
    支持将多个进程分组管理,可以统一启动、停止或重启整个进程组,适用于复杂的多进程应用场景。

  • Web 界面:
    提供了一个简单的 Web 界面,可以通过浏览器方便地管理和查看进程状态。

  • 事件通知:
    支持事件机制,可以配置在进程状态变化(如启动、停止、重启)时发送通知,以便及时响应。

  • 跨平台:
    运行在大多数 Unix-like 操作系统上,包括 Linux 和 macOS。

缺点

  • 不适合管理系统服务:
    Supervisor 设计用于应用进程管理,而不是系统服务。因此,不适合作为 init 系统(如 systemd 或 upstart)的替代品来管理系统服务。

  • 性能开销:
    由于 Supervisor 需要守护进程不断监控子进程的状态,可能会带来一些性能开销,尤其是在要管理大量进程的情况下。

  • 权限管理:
    需要小心配置文件权限,因为 Supervisor 运行的进程会继承 Supervisor 的权限,可能带来安全风险。

  • 复杂性:
    虽然配置文件比较简单,但对于一些复杂的需求(如特定的启动顺序、依赖关系等),配置可能变得较为复杂。

  • 容器化环境下的局限性:
    在容器化环境(如 Docker 和 Kubernetes)中,Supervisor 的功能可能部分与容器编排系统的功能重叠,可能不再是最佳选择。

Supervisor适用场景

适合以下场景:

管理长时间运行的应用:如 Web 服务器、数据库服务器等。
需要高可用性的应用:自动重启崩溃的进程,确保服务持续运行。
多进程应用:管理一组相关的进程,提供统一的管理界面。
开发和测试环境:方便地启动和监控多个测试进程。

不适用场景:

系统服务管理:不要将 Supervisor 用于管理系统服务,更适合使用 systemd、upstart 等 init 系统。
轻量级容器环境:在 Docker 或 Kubernetes 中,可能更适合使用容器编排工具自身的进程管理功能。

优缺点总结

Supervisor 是一个强大且灵活的进程管理工具,适用于许多应用场景,尤其是在需要高可用性和简单进程管理的情况下。尽管它有一些局限性,但在适当的环境中使用 Supervisor 仍然可以大大简化进程管理工作,提高系统的可靠性和可维护性。

Linux进程管理工具——supervisor

原文链接:https://blog.csdn.net/General_zy/article/details/123613344

Supervisor (http://supervisord.org) 是一个用 [Python] 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动

supervisor

Supervisor 是一个客户端/服务器系统,它允许其用户控制类 UNIX 操作系统上的许多进程。
Supervisor 不支持windows。
官网:http://www.supervisord.org/introduction.html

组件

supervisord:这个是supervisor服务的主要管理器,负责管理配置的子进程,包括重启崩溃或异常退出的子进程,同时也响应来自客户端的请求。
supervisorctl:supervisord服务的客户端命令行。
Web Server:通过web界面查看和控制进程状态。访问服务器 URL(http://localhost:9001/),通过 Web 界面查看和控制进程状态。
XML-RPC Interface:服务于web UI的同一个HTTP服务器提供一个XML-RPC接口,可以用来询问和控制管理程序及其运行的程序。

安装

pip安装

pip install supervisor

yum/apt-get安装

yum install supervisor/apt-get install supervisor

如果使用yum install -y supervisor的命令安装,会生成默认配置/etc/supervisord.conf和目录/etc/supervisord.d,如果没有则自行创建。

easy_install安装
sudo yum install python-setuptools-devel
easy_install supervisor
检验是否安装

echo_supervisord_conf 会打印出supervisor的默认配置文件

# 1 安装完成后,会在 /usr/bin 下加入三个命令:
[root@lqz bin]# ls |grep super
echo_supervisord_conf  # 生成一个配置文件示例
supervisorctl          # 服务端
supervisord            # 客户端

# 2 安装完成后,会在 /etc 下创建一个 supervisord.d目录用于存放supervisor的配置文件,
# 还有一个supervisord.conf配置文件(如果没有使用命令: echo_supervisord_conf > /etc/supervisord.conf 生成)

[root@lqz etc]# ls |grep super
supervisord.conf
supervisord.d

# 3 方便起见,把supervisor服务器相关的配置写入supervisord.conf中,把监控各个进程的配置,按照进程名存在 supervisord.conf 目录下。(这个可以在supervisord.conf中的[include]部分下配置)
修改目录(默认是没有配置文件的)
# 新建supervisor根目录
mkdir /etc/supervisor

# 将配置文件追加写入咱们的配置文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
配置文件

【注:配置文件里面,前面加 ; 表示注释】

; 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

简单说明:

[unix_http_server] 配置socket连接部分
[supervisord] 配置supervisor服务器部分
[supervisorctl] 配置supervisor客户端部分
[inet_http_server] 配置web管理界面
[include] 配置需要引入的其他配置

精简配置文件
[unix_http_server]
file=/tmp/supervisor.sock   ; UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ; socket 文件的 mode,默认是 0700
;chown=nobody:nogroup       ; socket 文件的 owner,格式: uid:gid

;[inet_http_server]         ; HTTP 服务器,提供 web 管理界面
;port=127.0.0.1:9001        ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性
;username=user              ; 登录管理后台的用户名
;password=123               ; 登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB        ; 日志文件大小,超出会 rotate,默认 50MB
logfile_backups=10           ; 日志文件保留备份数量默认 10
loglevel=info                ; 日志级别,默认 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 文件
nodaemon=false               ; 是否在前台启动,默认是 false,即以 daemon 的方式启动
minfds=1024                  ; 可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ; 可以打开的进程数的最小值,默认 200

; 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:///tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord

; 包含其他的配置文件
[include]
files = relative/directory/*.ini    ; 可以是 *.conf 或 *.ini

使用

新建子配置文件夹

mkdir /etc/supervisor/supervisord.d/

修改系统配置文件
yum安装的

vim /usr/supervisor/supervisord.conf将.ini改为.conf

[include]
files = /usr/supervisor/supervisord.d/*.conf
pip安装的

vim /etc/supervisor/supervisord.conf(咱们自己新建的)

[include]
files = /usr/supervisor/supervisord.d/*.conf
web浏览

去掉[inet_http_server]的注释即可。

# 1 修改配置文件
vim /etc/supervisord.conf 

# 2 修改内容如下
[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0: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))

# 3 重启
supervisorctl reload

# 4 在浏览器打开:http://101.133.225.166:8080/
可以看到
启动服务

supervisord -c /etc/supervisor/supervisord.conf

Supervisor配置systemctl服务,开机自动启
# 1 新建配置文件
vim  /usr/lib/systemd/system/supervisor.service
[Unit]
Description=supervisor
After=network.target

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

[Install]
WantedBy=multi-user.target

# yum安装时生成的:
vim  /usr/lib/systemd/system/supervisor.service
[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf

[Install]
WantedBy=multi-user.target


# 3 干掉原先的supervisor进程
ps -ef|grep super
root     14465     1  0 00:58 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
kill 14465

#4 使用systemctl启动
systemctl start supervisor.service
systemctl status supervisor.service

#5 开机自启
systemctl enable supervisor.service
增加配置文件

cat > /etc/supervisor/supervisord.d/supervisor_test_one.conf

[program:监管我1]
command=java -jar /data/smallvideo/supervisor/taskApp-exec.jar TaskTestOne  ; 被监控的进程路径
priority=1                    ; 数字越高,优先级越高
numprocs=1                    ; 启动几个进程
autostart=true                ; 随着supervisord的启动而启动
autorestart=true              ; 自动重启
startretries=10               ; 启动失败时的最多重试次数
exitcodes=0                   ; 正常退出代码
stopsignal=KILL               ; 用来杀死进程的信号
stopwaitsecs=10               ; 发送SIGKILL前的等待时间
redirect_stderr=true          ; 重定向stderr到stdout

[program:监管我2]
command=java -jar /data/smallvideo/supervisor/taskApp-exec.jar TaskTestTwo   ; 被监控的进程路径
priority=1                    ; 数字越高,优先级越高
numprocs=1                    ; 启动几个进程
autostart=true                ; 随着supervisord的启动而启动
autorestart=true              ; 自动重启
startretries=10               ; 启动失败时的最多重试次数
exitcodes=0                   ; 正常退出代码
stopsignal=KILL               ; 用来杀死进程的信号
stopwaitsecs=10               ; 发送SIGKILL前的等待时间
redirect_stderr=true          ; 重定向stderr到stdout
supervisor常用命令(supervisorctl)
update 更新新的配置到supervisord(不会重启原来已运行的程序)
reload 载入所有配置文件,并按新的配置启动、管理所有进程(会重启原来已运行的程序)
start xxx: 启动某个进程
restart xxx: 重启某个进程
stop xxx: 停止某一个进程(xxx),xxx为[program:theprogramname]里配置的值
stop groupworker: 重启所有属于名为groupworker这个分组的进程(start,restart同理)
stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文
#关闭所有任务
supervisorctl shutdown 
# 启动某个进程
supervisorctl start programxxx
# 重启某个进程
supervisorctl restart programxxx
# 停止全部进程 注:start、restart、stop都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
supervisorctl update


# 1启动supervisord管理的所有进程
supervisorctl start all
#2 停止supervisord管理的所有进程
supervisorctl stop all
#3 启动supervisord管理的某一个特定进程
supervisorctl start program-name   # program-name为[program:xx]中的xx
# 4 停止supervisord管理的某一个特定进程
supervisorctl stop program-name  // program-name为[program:xx]中的xx
# 5 重启所有进程或所有进程
supervisorctl restart all 
# 重启所有supervisorctl reatart program-name 
# 重启某一进程,program-name为[program:xx]中的xx
# 6 查看supervisord当前管理的所有进程的状态
supervisorctl status
supervisor涉及的状态主要有

输入命令supervisorctl,可以进入交互界面,看到它监管的进程状态:

[root@root]# supervisorctl
nginx    FATAL   Exited too quickly (process log may have details)
supervisor>

running:进程处于运行状态
starting:Supervisor 收到启动请求后,进程处于正在启动过程中
stopped:进程处于关闭状态
stopping:Supervisor 收到关闭请求后,进程处于正在关闭过程中
backoff:进程进入 starting 状态后,由于马上就退出导致没能进入 running 状态
fatal:进程没有正常启动
exited:进程从 running 状态退出

program 配置
# 只要在/etc/supervisord.d/目录下所有 *.ini都会被管理
vi /etc/supervisord.d/redis.ini
[program:redis-server]
command=/usr/bin/redis-server /etc/redis/6379.conf
priority=999                ; 优先级(越小越优先)
autostart=true              ; supervisord启动时,该程序也启动
autorestart=true            ; 异常退出时,自动启动
startsecs=10                ; 启动后持续10s后未发生异常,才表示启动成功
startretries=3              ; 异常后,自动重启次数
exitcodes=0,2               ; exit异常抛出的是0、2时才认为是异常
stopsignal=QUIT             ; 杀进程的信号

; 在程序发送stopignal后,等待操作系统将SIGCHLD返回给supervisord的秒数。
; 如果在supervisord从进程接收到SIGCHLD之前经过了这个秒数,
; supervisord将尝试用最终的SIGKILL杀死它
stopwaitsecs=1
user=root                   ; 设置启动该程序的用户
log_stdout=true             ; 如果为True,则记录程序日志
log_stderr=false            ; 如果为True,则记录程序错误日志
logfile=/var/log/redis-server.log    ; 程序日志路径
logfile_maxbytes=1MB        ; 日志文件最大大小
logfile_backups=10          ; 日志文件最大数量
监听一个nginx
# 1. vim nginx_super.conf
   vim nginx_super.conf

# 2. 配置监听文件配置
   [program: nginx]
   command=/usr/local/nginx/sbin/nginx  -g 'daemon off;'
   directory=/home/work
   autorestart=true
   autostart=true
   stderr_logfile=/home/work/super/error.log
   stdout_logfile=/home/work/super/stdout.log
   environment=ASPNETCORE_ENVIRONMENT=Production
   user=root
   stopsignal=INT
   startsecs=10
   startretries=5
   stopasgroup=true
# 3. 杀掉nginx,然后再启动supervisor就可以了,它会自动把nginx启动起来
   nginx -s stop
   supervisord -c /etc/supervisor/supervisord.conf  ##启动supervisor
讲解

nginx的这个启动命令默认是后台启动,supervisor不能监控后台程序,所以就会一直执行这个命令,不断的启动Nginx,就会报错, 加上-g ‘daemon off;’ 这个参数可解决这问题。

[program: nginx]    
;管理的子进程,后面的是名字。
command=/usr/local/nginx/sbin/nginx  -g 'daemon off;'    
;启动进程的命令路径,可以带参数。
directory=/root ;   
;进程运行前,会先切换到这个目录
autorestart=true; 
;设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。
;false表示无论什么情况下,都不会被重新启动;
;unexpected表示只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。
;当为true的时候,只要子进程挂掉,将会被无条件的重启
autostart=true ;    
;如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true
stderr_logfile=/home/work/super/nginx_error.log ;   
;日志
stdout_logfile=/home/work/super/nginx_stdout.log ;  
;日志
environment=ASPNETCORE_ENVIRONMENT=Production ;  
;子进程的环境变量,默认为空
user=root ;     
;可以用来管理该program的用户
stopsignal=INT   
;进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1等,默认为TERM
startsecs=10 ;    
;子进程启动多少秒之后,此时状态如果是running,我们认为启动成功了,默认值1
startretries=5 ;
;当进程启动失败后,最大尝试的次数。当超过5次后,进程的状态变为FAIL
stopasgroup=true   
;这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。
;那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。
;所以可以设置这个选项,把整个该子进程的整个进程组干掉。默认false

常见报错

Error: not a valid boolean value: ‘true;’ in section ‘program:nginx’ (file: ‘/etc/supervisor/supervisord.d/nginx_super.conf’)
把;删掉
command=/usr/local/nginx/sbin/nginx -g 'daemon off;'看清楚;是在daemon off;内

Q&A
BACKOFF Exited too quickly (process log may have details)
# 报错
BACKOFF   Exited too quickly (process log may have details)

# 原因
supervisor 比较适合监控业务应用,且只能监控前台程序,实现的daemon【后台启动】的程序不能用它监控,否则supervisor> status 会提示:BACKOFF  Exited too quickly (process log may have details)
FATAL Exited too quickly (process log may have details
# 报错
FATAL     Exited too quickly (process log may have details

# 原因
错误FATAL产生的原因可能是你的python命令的环境配置有问题,如果你是虚拟环境配置的话,必须使用虚拟环境的路径的python或gunicorn命令否则会失败!

# 解决
[program:gunicorn]
command=/root/.local/share/virtualenvs/blog/bin/gunicorn -c other_config/gunicorn.py main:app 
#; 这里的gunicorn必须是你运行python环境对应的环境【如果是虚拟环境就必须配置虚拟环境的路径下面的命令】
autostart = true     ; 在 supervisord 启动的时候也自动启动
unix:///var/run/supervisor/supervisor.sock no such file
# 报错
unix:///var/run/supervisor/supervisor.sock no such file

# 解决
sudo chmod 777 /run
sudo chmod 777 /var/log
linking stale socket /var/run/supervisor/supervisor.sock
# 报错
Unlinking stale socket /var/run/supervisor/supervisor.sock

# 解决(或者直接删除)
unlink /var/run/supervisor/supervisor.sock
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
#报错
Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

#解决
ps aux | grep supervisord
kill - 9 进程ID

supervisor进程监控跟systemctl开机启动会有冲突吗

Supervisor 和 systemctl(systemd) 是两个不同的进程管理工具,它们的功能有一定的重叠,但它们的设计目标和使用场景有所不同。将二者结合使用时,确实可能会遇到一些冲突或重叠,但通过适当的配置,这些冲突通常是可以避免的。

可能的冲突

  • 进程重复启动:
    如果同一个应用程序既由 Supervisor 监控,又由 systemd(通过 systemctl)配置为开机启动,可能会导致进程被重复启动,从而引发端口占用错误或其他资源冲突。

  • 管理混乱:
    使用两个不同的工具管理同一个进程可能会导致管理上的混乱,例如,一个工具认为进程已经启动,而另一个工具则尝试重新启动这个进程。

如何避免冲突

  • 明确职责:
    在规划系统的进程管理时,明确分配 Supervisor 和 systemd 各自的职责。通常,systemd 更适合用于管理系统级服务,而 Supervisor 更适合用于管理应用级进程。

  • 不要重叠管理:
    确保同一个进程不会同时被 Supervisor 和 systemd 管理。如果某个进程由 Supervisor 管理,就不要再通过 systemd 配置其开机启动,反之亦然。
    组合使用的最佳实践

为了避免冲突,可以考虑以下几种组合使用的方法:

方法一:使用 systemd 管理 Supervisor

可以将 Supervisor 设置为 systemd 的一个服务,这样 Supervisor 会在系统启动时自动启动,并接管其管理的所有进程。下面是配置步骤:
创建一个 Supervisor 的 systemd 单元文件,例如 /etc/systemd/system/supervisord.service:

ini
[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
User=root

[Install]
WantedBy=multi-user.target

重新加载 systemd 配置并启用 Supervisor 服务:

sudo systemctl daemon-reload
sudo systemctl enable supervisord
sudo systemctl start supervisord

在这种方法中,systemd 负责启动和监控 Supervisor,而 Supervisor 则管理其配置文件中定义的所有进程。

方法二:使用 Supervisor 管理应用进程

将所有需要管理的应用进程都交给 Supervisor 处理,而 systemd 仅用于启动 Supervisor 本身。这意味着 systemd 不再直接管理这些应用进程。
确保 application 不在 systemd 启动项中。
在 Supervisor 的配置文件中定义所有需要管理的进程。

ini
[program:your-app]
command=java -jar /path/to/your-application.jar
autostart=true
autorestart=true
stdout_logfile=/var/log/your-app/your-app.out.log
stderr_logfile=/var/log/your-app/your-app.err.log

总结

Supervisor 和 systemd 各自具有不同的优势,并适用于不同的场景。通过适当的配置,二者可以很好地结合使用,而不会产生冲突:
Supervisor:适用于管理应用级的长时间运行进程,提供了丰富的管理功能,如自动重启、日志管理等。
systemd:适用于管理系统级服务,并可以通过 systemd 来管理 Supervisor 本身。
通过明确分工和合理配置,可以避免冲突,充分利用二者的优势来实现稳定和高效的进程管理。

Last Updated: 2024/07/24 14:53:14
linux基础_linux上如何测试websocket [nginx] connect() failed (111: Connection refused) while connecting to upstream