关于进程管理工具 Supervisord 的使用
http://www.supervisord.org/
# 它是由Python实现的进程管理工具,只能管理在前台运行的程序,若应用有后台运行的选项则需要关闭
# 可以很方便的用来启动、重启、关闭进程,除了对单个进程控制外,还可以同时启停多个进程
# 例如服务器故障导致所有应用被杀,此时可用其同时启动所有应用而不必一个个地敲命令启动 ...
# 当进程挂掉时Linux不会自动重启,想要自动重启的话还要自己写监控重启脚本,而supervisor可以完美解决这些问题
# Supervisor 通过 "fork/exec" 的方式将这些被管进程作为其子进程来启动
# 因此只要在supervisor的配置中把要管理的进程的可执行文件的路径写入即可,省下了Linux管理进程时写控制脚本的麻烦
# supervisor 可以对进程组统一管理,也就是说可以把需要管理的进程写到一个组里面
# 然后把这个组作为一个对象进行管理,如启动,停止,重启等操作...
# ------------------------------------------------------------------------- SETUP
# 方式1
# pip install supervisor
# 方式2
# 从 PyPi 下载并解压后运行: python setup.py install
# 安装后执行如下命令生成默认配置项
echo_supervisord_conf > /etc/supervisord.conf
# 运行
supervisord -c /etc/supervisord.conf
ps aux | grep supervisord
# supervisord 配置文件的默认读取路径:
# $CWD/supervisord.conf
# $CWD/etc/supervisord.conf
# /etc/supervisord.conf
# /etc/supervisor/supervisord.conf(Supervisor 3.3.0+)
# ../etc/supervisord.conf(相对于可执行文件)
# ../supervisord.conf(相对于可执行文件)
# -------------------------------------------------------------------------
# 关于supervisor的运行参数
# http://www.supervisord.org/running.html#supervisord-command-line-options
# 关于supervisorctl的运行参数
# http://www.supervisord.org/running.html#supervisorctl-command-line-options
/etc/supervisord.conf
[unix_http_server] ; 非必须
file=/tmp/supervisor.sock ; UNIX socket 文件,由 supervisorctl 命令使用 (建议修改为 /var/run 目录,避免被系统删除)
chmod=0700 ; socket 文件的 mode,默认: 0700
chown=nobody:nogroup ; socket 文件的 owner,格式: uid:gid
username = chris ;
password = 123 ;
[inet_http_server] ; supervisor 的HTTP服务,提供 UI 管理界面
port=127.0.0.1:9001 ; HTTP服务监听的IP+端口,若开放到公网需注意安全
username= chris ; 登录管理后台的用户名
password=123 ; 登录管理后台的密码
[supervisorctl] ; 与supervisorctl相关的配置
serverurl = unix:///tmp/supervisor.sock ; supervisorctl 通过其连接 supervisord,路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord
username = chris
password = 123
prompt = mysupervisor ; 用作超级用户提示的字符串
[supervisord]
nodaemon = true ; 当在Docker容器内用于管理后台守护进程时需将Supervisor设为前台启动
logfile = /tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log (建议改为 /var/log 目录)
logfile_maxbytes = 50MB ; 日志大小,超出会 rotate,默认 50MB
logfile_backups=10 ; 日志文件保留备份数量,默认 10
loglevel = info ; 日志级别,默认 info,其它: debug,warn,trace
pidfile = /tmp/supervisord.pid ; 建议改为 /var/run 目录
minfds = 1024 ; 可以打开的文件描述符的最小值,默认 1024
minprocs = 200 ; 可以打开的进程数的最小值,默认 200
umask = 022 ;
user = chrism ; http://www.supervisord.org/configuration.html
directory = /tmp ; 程序启动目录
childlogdir = /tmp ;
strip_ansi = false ;
environment = KEY1="value1",KEY2="value2" ; 环境变量
[program:usercenter] ; usercenter 是应用的标识,对其的操作如 start、restart 等都通过此名字实现
directory = /home/leon/projects/usercenter ; 程序启动目录、工作目录
command = gunicorn -w 8 -b 0.0.0.0:17510 --loglevel=%(ENV)s wsgi:app ; 启动命令,可以是绝对或相对命令,其中%(ENV)s是读取环境变量
priority=1 ; 启动优先级
autostart = true ; 在 supervisord 启动时是否也自动启动
autorestart = true ; 程序异常退出后自动重启
startsecs = 5 ; 启动 5 秒后没有异常退出就当作已正常启动
startretries = 3 ; 启动失败后的重试次数,默认 3
exitcodes=0,2 ; 期望或者说预料中的进程退出码
stopsignal=TERM ;
stopwaitsecs=10
environment=A="1",B="2" ; 环境变量
user = root ; 由哪个用户身份启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_events_enabled=false ;
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
stdout_logfile = /data/logs/usercenter_stdout.log ; 日志文件,需注意当指定的日志路径中的目录不存在时无法正常启动,所以需手动创建目录
; 有时被托管的程序还会有子进程(如 Tornado),若只杀主进程,子进程就可能变成孤儿进程,通过以下两项配置来确保所有子进程都能正确停止
stopasgroup = true
killasgroup = true
[include]
files = relative/directory/*.ini ; 包含其他的配置文件,可以是 *.conf 或 *.ini
Groups
[group:thegroupname]
; 这就是给programs分组,划分到组里的program就不用一个个去操作了,可使用组名进行统一操作
; program被划分到组后就相当于原来的配置从supervisor的配置文件里消失了,supervisor只会对组进行管理,而不再会对组里面的单个program进行管理了
programs=progname1,progname2 ; 用逗号分隔的组成员,这是个必须的设置项
priority=999
supervisorctl
# Supervisorctl 是命令行客户端
# 启动时需要指定与 supervisord 使用相同配置文件,否则与 supervisord 按照一样的顺序查找配置文件
supervisorctl -c /etc/supervisord.conf
# supervisor> status # 查看程序状态
# supervisor> stop usercenter # 关闭 usercenter 程序
# supervisor> start usercenter # 启动 usercenter 程序
# supervisor> restart usercenter # 重启 usercenter 程序
# supervisor> reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
# supervisor> update # 重启配置文件修改过的程序
# 上面这些命令都有相应的输出,除进入supervisorctl的SHELL界面以外,也可直接在终端执行
# supervisorctl status
# supervisorctl stop usercenter
# supervisorctl start usercenter
# supervisorctl restart usercenter
# supervisorctl reread
# supervisorctl update
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!