linux命令 systemctl 和 supervisord 区别及用法解读
目录
- 基础与背景
- 服务管理范围
- 配置文件和管理方式
- 监控与日志
- 依赖管理
- 适用场景
- 常用命令对照表
- 实际应用场景举例
- 优缺点对比小结
- 参考链接
1. 基础与背景
systemctl 和 supervisord 都是用于管理和控制服务(进程)的工具,但它们在设计、使用场景和功能上有所不同。以下是它们之间的主要区别:
- systemctl:
- systemctl 是 systemd 的一部分,systemd 是 Linux 系统中的系统和服务管理器,负责在系统启动时管理系统进程、挂载文件系统、处理网络配置等。
- systemctl 通过管理 systemd 单元(unit files)来控制系统服务。
- systemctl 通常是现代 Linux 发行版中的默认服务管理工具(如 CentOS 7+, Ubuntu 15.04+)。
- supervisord:
- supervisord 是一个进程管理工具,专门用于监控和管理独立的后台进程。
- 它是 Python 编写的,并且被设计用于跨平台运行,主要用于启动、监控、重启应用程序。
- supervisor 最早主要用于开发环境和特定服务的进程管理,通常不管理系统服务。
2. 服务管理范围
- systemctl(systemd):
- 负责管理所有系统服务,包括启动、停止、重启、启用(开机启动)和禁用服务。
- 可以管理系统级别的服务,比如网络服务、守护进程等。
- 更侧重于系统启动时的服务管理,并且可以管理定时任务(通过 timers)、设备挂载、网络配置等。
- supervisord:
- 主要用于管理用户定义的应用进程,例如应用程序、后台任务、Web服务等。
- 适合多进程的应用程序或需要长期运行的任务的监控和管理。
- supervisor 可以定期监控和重启由于异常退出的进程。
3. 配置文件和管理方式
- systemctl:
- 使用 unit files,它们位于 /etc/systemd/system/ 或 /lib/systemd/system/ 目录下。这些文件通常以 .service、.target、.mount、.timer 等后缀结尾。
- 配置文件格式相对固定,基于 INI 风格,包含 [Unit]、[Service]、[Install] 等配置段。
- 常见命令:
- systemctl start/stop/restart :启动/停止/重启服务。
- systemctl enable/disable :启用/禁用服务开机启动。
systemctl(systemd)配置文件示例
示例1:简单的自定义服务
[Unit]
Description=My Simple Service
After=network.target[Service]
ExecStart=/usr/bin/python3 /opt/myscript.py
Restart=on-failure[Install]
WantedBy=multi-user.target
说明:此配置定义了一个在网络服务启动后运行的 Python 脚本服务,异常退出时自动重启。
示例2:带环境变量和工作目录的服务
[Unit]
Description=Node.js Web App[Service]
WorkingDirectory=/opt/webapp
ExecStart=/usr/bin/node server.js
Environment=NODE_ENV=production PORT=8080
Restart=always[Install]
WantedBy=multi-user.target
说明:此配置用于 Node.js Web 应用,指定了工作目录和环境变量,并设置为始终重启。
- supervisord:
- 使用独立的配置文件,通常位于 /etc/supervisor/supervisord.conf 或类似目录中。
- 进程定义在 [program:x] 区块中,指定每个进程的启动命令、环境变量、日志、重启策略等。
- 常见命令:
- supervisorctl start/stop :启动/停止某个进程。
- supervisorctl reread/update:重新读取配置文件并应用更改。
supervisord 配置文件示例
示例1:管理单个 Python 进程
[program:myworker]
command=python3 /opt/worker.py
autostart=true
autorestart=true
stderr_logfile=/var/log/myworker.err.log
stdout_logfile=/var/log/myworker.out.log
说明:此配置定义了一个自动启动和自动重启的 Python worker 进程,并分别记录标准输出和错误日志。
示例2:管理 Node.js 服务并设置环境变量
[program:webapp]
command=node /opt/webapp/server.js
directory=/opt/webapp
autostart=true
autorestart=true
environment=NODE_ENV="production",PORT="8080"
stdout_logfile=/var/log/webapp.log
stderr_logfile=/var/log/webapp.err.log
说明:此配置用于 Node.js 服务,指定了工作目录和环境变量,并配置了日志输出。
supervisord 可视化界面(Web UI)配置示例
Supervisor 自带一个简单的 Web 管理界面,可以通过配置 [inet_http_server] 实现。该界面支持进程的启动、停止、重启、日志查看等操作。
示例:启用 Web 管理界面
[inet_http_server]
port=0.0.0.0:9001 ; 监听所有网卡的 9001 端口
username=admin ; 登录用户名
password=123456 ; 登录密码
说明:此配置启用了 supervisord 的 Web UI,访问 http://服务器IP:9001 即可进入管理界面。可通过用户名和密码进行身份验证。
Web UI 功能简介:
- 查看所有受管进程的状态
- 启动、停止、重启进程
- 查看进程日志
- 便于远程管理和监控
注意:生产环境建议配置防火墙或反向代理,限制 Web UI 的访问范围,避免安全风险。
详细说明
Supervisor 的 Web UI 是一个基于 HTTP 的管理界面,默认集成在 supervisord 主进程中,无需额外安装。通过 Web 浏览器即可远程管理和监控所有受 supervisord 管理的进程。
1. 访问方式
- 启用 [inet_http_server] 后,在浏览器中访问
http://<服务器IP>:9001
。 - 需要输入配置文件中设置的用户名和密码进行登录。
- 支持局域网和公网访问(建议生产环境仅限内网或通过 VPN/反向代理访问)。
2. 界面主要功能
- 进程状态总览:主界面显示所有受管进程的名称、状态(RUNNING、STOPPED、FATAL 等)、启动时间、进程号等。
- 进程操作:可对单个或全部进程进行启动、停止、重启操作。
- 日志查看:可直接在网页中查看每个进程的标准输出(stdout)和标准错误(stderr)日志,支持实时刷新。
- 进程分组:如果配置了 group,可以分组显示和管理进程。
- 自动刷新:界面支持自动刷新,便于实时监控。
3. 常见操作演示
- 启动/停止/重启进程:点击对应进程后的"Start"、“Stop”、"Restart"按钮即可。
- 查看日志:点击"View Log"可弹出日志窗口,支持滚动和刷新。
- 一键操作全部进程:页面顶部有"Start All"、“Stop All”、"Restart All"按钮。
4. 权限与安全建议
- 默认仅支持单一用户名和密码,建议设置复杂密码。
- 建议仅监听 127.0.0.1(即
port=127.0.0.1:9001
),通过 SSH 隧道、VPN 或 Nginx 反向代理(带认证)进行访问。 - 如需公网访问,务必做好防火墙限制和强密码设置。
- 不支持多用户分级权限,适合小型团队或个人运维场景。
5. 常见问题
- 端口被占用:如 9001 端口被占用,可修改为其他未被占用端口。
- 无法访问:检查 supervisord 是否已重启、端口监听地址是否正确、防火墙是否放行。
- 安全风险:切勿将 Web UI 直接暴露在公网,避免被暴力破解。
6. 相关截图与文档
- 官方界面截图可参考:Supervisor Web UI 截图
- 更多配置说明见:Supervisor 官方文档 - inet_http_server
4. 监控与日志
- systemctl:
- systemd 自带强大的日志管理功能,通过 journalctl 来查看系统和服务的日志。
- 支持将日志集中管理并可以通过高级过滤器进行查询。
- supervisord:
- supervisor 支持为每个进程定义独立的日志文件,并可以配置标准输出和错误输出重定向。
- 可以实时查看每个进程的日志文件,但不会像 systemd 那样提供统一的日志查看命令。
5. 依赖管理
- systemctl:
- 可以处理服务之间的依赖关系。例如,服务 A 依赖于服务 B,那么 systemd 可以确保在启动 A 之前先启动 B。
- 可以通过 Before=, After=, Requires=, Wants= 等指令来设置依赖顺序。
- supervisord:
- 不直接处理依赖关系。各个进程通常被独立管理,如果需要依赖关系管理,需要手动配置顺序或借助外部工具。
6. 适用场景
- systemctl(systemd):
- 更适合管理系统级别的服务、网络服务、守护进程、设备挂载等。
- 推荐用于服务器和系统服务的管理,因为它提供了丰富的功能来处理服务依赖、启动顺序、资源限制等。
- supervisord:
- 更适合管理独立应用程序、Web 服务、批处理任务或需要独立监控的进程。
- 尤其适合开发环境或容器中需要管理多个进程的情况。
7. 常用命令对照表
功能 | systemctl 命令 | supervisord/supervisorctl 命令 |
---|---|---|
启动服务/进程 | systemctl start | supervisorctl start |
停止服务/进程 | systemctl stop | supervisorctl stop |
重启服务/进程 | systemctl restart | supervisorctl restart |
查看状态 | systemctl status | supervisorctl status |
开机自启 | systemctl enable | 配置 autostart=true |
禁用开机自启 | systemctl disable | 配置 autostart=false |
查看日志 | journalctl -u | 查看配置的日志文件 |
重新加载配置 | systemctl daemon-reload | supervisorctl reread/update |
8. 实际应用场景举例
- systemctl 典型场景:
- 管理 Nginx、MySQL、Docker 等系统服务
- 设置服务开机自启
- 管理定时任务、设备挂载等
- supervisord 典型场景:
- 管理 Python、Node.js 等 Web 应用进程
- 监控爬虫、定时脚本等长期运行的任务
- 容器(如 Docker)中一键管理多个自定义进程
9. 优缺点对比小结
对比项 | systemctl (systemd) | supervisord |
---|---|---|
管理对象 | 系统服务、守护进程 | 应用进程、用户自定义进程 |
配置复杂度 | 较高,需编写 unit 文件 | 较低,配置灵活 |
日志管理 | 集中管理,支持过滤 | 各进程独立日志 |
依赖管理 | 支持服务依赖、启动顺序 | 不支持,需要手动处理 |
适用场景 | 系统服务、服务器、生产环境 | 应用进程、开发环境、容器 |
自动重启 | 支持(需配置 Restart) | 默认支持 |
跨平台 | 仅 Linux | 跨平台(Python 环境) |
10. 参考链接
- systemd 官方文档
- Supervisor 官方文档
- systemctl 使用详解
- Supervisor 配置详解
两者可以根据不同的场景结合使用。如果你的需求是管理系统服务,systemctl 是更合适的选择;如果你需要监控和自动重启特定的应用程序进程,supervisord 更适合。