logo
GitHub

Supervisor 完全指南:进程管理利器

在服务器运维和应用部署中,进程管理是一个非常重要的话题。如何确保应用程序持续运行?如何在程序崩溃时自动重启?如何管理多个进程?Supervisor 就是为解决这些问题而生的工具。本文将全面介绍 Supervisor 的使用方法,从基础到进阶,帮助你掌握这个强大的进程管理工具。

什么是 Supervisor?

Supervisor 是一个用 Python 编写的进程管理工具,它能够将一个普通的命令行进程变为后台守护进程,并监控该进程的运行状态,在进程退出时自动重启。它提供了丰富的配置选项和便捷的管理接口,是 Linux/Unix 系统下服务进程管理的首选工具之一。

Supervisor 的主要特性:

  • 进程的启动、停止、重启
  • 进程崩溃自动重启
  • 进程组管理
  • 日志管理
  • Web 管理界面
  • 权限管理
  • 事件通知

安装 Supervisor

Supervisor 的安装非常简单,可以通过包管理器或 pip 进行安装。

使用包管理器安装

在 Ubuntu/Debian 系统:

Terminal window
sudo apt update
sudo apt install supervisor

在 CentOS/RHEL 系统:

Terminal window
sudo yum install epel-release
sudo yum install supervisor

使用 pip 安装

Terminal window
pip install supervisor

安装完成后,Supervisor 会创建以下重要文件和目录:

  • /etc/supervisor/supervisord.conf:主配置文件
  • /etc/supervisor/conf.d/:程序配置文件目录
  • /var/log/supervisor/:日志文件目录

Supervisor 基本配置

主配置文件

Supervisor 的主配置文件通常位于 /etc/supervisor/supervisord.conf,包含了 Supervisor 的全局设置。以下是一个基本的配置示例:

[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700
[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[include]
files = /etc/supervisor/conf.d/*.conf

程序配置文件

对于每个需要管理的程序,我们需要在 /etc/supervisor/conf.d/ 目录下创建一个配置文件。例如,创建一个名为 myapp.conf 的配置文件:

[program:myapp]
command=/usr/bin/python /path/to/your/app.py
directory=/path/to/your/app
user=www-data
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/myapp.err.log
stdout_logfile=/var/log/supervisor/myapp.out.log
environment=PATH="/usr/local/bin:/usr/bin:/bin"

Supervisor 常用命令

supervisorctl 基本操作

Terminal window
# 启动 supervisord
sudo supervisord
# 查看所有程序状态
sudo supervisorctl status
# 启动特定程序
sudo supervisorctl start myapp
# 停止特定程序
sudo supervisorctl stop myapp
# 重启特定程序
sudo supervisorctl restart myapp
# 重新加载配置文件
sudo supervisorctl reread
sudo supervisorctl update
# 进入交互式命令行
sudo supervisorctl

进阶配置

进程组管理

可以将多个相关的程序组织成一个组:

[group:mygroup]
programs=prog1,prog2,prog3
[program:prog1]
command=/path/to/prog1
...
[program:prog2]
command=/path/to/prog2
...
[program:prog3]
command=/path/to/prog3
...

环境变量配置

[program:myapp]
command=/path/to/app
environment=
PATH="/usr/local/bin:/usr/bin:/bin",
NODE_ENV="production",
DATABASE_URL="postgresql://user:pass@localhost/db"

事件监听器

[eventlistener:memmon]
command=memmon -p program_name=1GB
events=TICK_60

日志管理

Supervisor 提供了强大的日志管理功能:

[program:myapp]
stdout_logfile=/var/log/supervisor/myapp.out.log
stderr_logfile=/var/log/supervisor/myapp.err.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_capture_maxbytes=1MB

Web 管理界面配置

可以启用 Supervisor 的 Web 界面进行可视化管理:

[inet_http_server]
port=*:9001
username=admin
password=123456

最佳实践

  1. 合理设置重启策略
[program:myapp]
startretries=3
startsecs=10
stopwaitsecs=10
  1. 使用优先级控制启动顺序
[program:database]
priority=100
[program:webapp]
priority=200
  1. 设置资源限制
[program:myapp]
user=nobody
umask=022

常见问题排查

  1. 进程无法启动
  • 检查命令路径是否正确
  • 检查用户权限
  • 查看错误日志
  1. 自动重启不生效
  • 确认 autorestart 配置
  • 检查 exitcodes 设置
  1. 日志文件权限问题
  • 确保日志目录存在
  • 检查目录权限

总结

Supervisor 是一个功能强大且易用的进程管理工具,它能够帮助我们:

  • 将普通进程转化为守护进程
  • 实现进程的自动重启
  • 提供便捷的进程管理接口
  • 处理日志记录
  • 支持进程组管理

通过合理配置和使用 Supervisor,我们可以大大简化服务器进程的管理工作,提高系统的可靠性和可维护性。

参考资料