Supervisor 是一个用于管理和监控进程的开源工具,特别适合管理长期运行的进程或后台服务。它可以用来启动、停止、重启和监控进程,并且能够自动重新启动崩溃的进程。下面是 Supervisor 的详细使用说明。
1. 安装 Supervisor
ubuntu可以使用apt安装
apt install -y supervisor
或者通过 pip
进行安装:
pip install supervisor
安装后,主要命令是 supervisord
(管理进程的服务)和 supervisorctl
(控制和管理进程的客户端)。
2. 配置文件
安装完成后,Supervisor 需要一个配置文件来定义需要管理的进程。默认配置文件路径为 /etc/supervisord.conf
,可以使用 echo_supervisord_conf
命令生成默认的配置文件。
echo_supervisord_conf > /etc/supervisord.conf
你可以根据需要修改生成的配置文件。以下是一个简单的配置文件示例:
[unix_http_server]
file=/tmp/supervisor.sock ; Unix socket 文件路径
[supervisord]
logfile=/tmp/supervisord.log ; 日志文件路径
pidfile=/tmp/supervisord.pid ; PID 文件路径
childlogdir=/tmp ; 子进程日志目录
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 通过 Unix socket 进行通信
[include]
files = /etc/supervisor/conf.d/*.conf ; 通过包含其他配置文件来管理多个服务
3. 定义要管理的进程
在 supervisord.conf
中,可以添加具体要管理的程序。在 /etc/supervisor/conf.d/
目录下,可以为每个进程创建一个独立的配置文件。以下是一个配置文件示例,假设我们要管理一个名为 myapp
的 Python 应用:
[program:myapp]
command=/usr/bin/python /path/to/myapp.py ; 启动程序的命令
autostart=true ; supervisord 启动时自动启动
autorestart=true ; 程序崩溃后自动重启
stderr_logfile=/var/log/myapp.err.log ; 错误日志路径
stdout_logfile=/var/log/myapp.out.log ; 标准输出日志路径
user=nobody ; 运行该程序的用户
4. Supervisor操作
systemctl enable supervisor #设置开机自启
systemctl start supervisor #启动
sudo supervisorctl update #更新配置
sudo supervisorctl status #查看supervisor状态
通过pip安装的,需要手动启动 supervisord
:
supervisord -c /etc/supervisord.conf
该命令会根据配置文件中的设定启动 supervisord
进程,并且启动所有配置中指定的子进程。
5. 使用 supervisorctl 管理进程
supervisorctl
是用于与 supervisord
交互的命令行工具。它可以用来查看进程状态、启动、停止和重启进程等。
supervisorctl status # 查看所有受管理的进程状态
supervisorctl stop myapp # 停止 myapp
supervisorctl start myapp # 启动 myapp
supervisorctl restart myapp # 重启 myapp
supervisorctl reload # 从新加载配置
如果你想对所有的服务进行操作,可以使用 all
关键字:
supervisorctl stop all # 停止所有进程
supervisorctl start all # 启动所有进程
6. 自动重启与日志
Supervisor 支持自动重启进程。如果一个进程意外退出,它可以根据配置文件中的 autorestart=true
选项自动重新启动。
Supervisor 还可以方便地管理日志。每个进程的标准输出和错误输出都可以分别配置到不同的日志文件中。
7. 进程优雅停止
当你停止 supervisord
或一个具体的进程时,Supervisor 默认会发送 SIGTERM
信号给进程,允许进程在结束前执行清理操作。如果进程没有在指定时间内停止,Supervisor 会发送 SIGKILL
信号强制终止进程。你可以通过 stopwaitsecs
来指定等待时间:
stopwaitsecs=10 ; 等待 10 秒让进程优雅退出
8. 常见问题排查
- 配置文件更改后不生效:修改配置文件后需要运行
supervisorctl reread
来重新读取配置,并使用supervisorctl update
应用更改。 - 进程频繁重启:可能是程序本身退出状态异常,或者配置中
startretries
设置次数太多。检查日志,确保进程的退出状态符合预期。
9. Supervisor API
Supervisor 还提供 XML-RPC 接口,可以通过程序访问 Supervisor 的状态和控制进程,适合需要通过 HTTP 或远程管理的场景。
总结
Supervisor 是一个功能强大且易于使用的进程管理工具,特别适用于需要长期运行的服务。通过合理配置,它可以实现自动重启、日志管理和进程状态监控,使运维工作更加简单高效。