当前位置: 首页 > java >正文

linux命令 systemctl 和 supervisord 区别及用法解读

目录

  1. 基础与背景
  2. 服务管理范围
  3. 配置文件和管理方式
  4. 监控与日志
  5. 依赖管理
  6. 适用场景
  7. 常用命令对照表
  8. 实际应用场景举例
  9. 优缺点对比小结
  10. 参考链接

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-reloadsupervisorctl 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 更适合。

http://www.xdnf.cn/news/10365.html

相关文章:

  • 【计算机网络】Linux下简单的UDP服务器(超详细)
  • 鸿蒙OSUniApp PWA开发实践:打造跨平台渐进式应用#三方框架 #Uniapp
  • Android第十二次面试-多线程和字符串算法总结
  • Mac电脑上本地安装 redis并配置开启自启完整流程
  • uni-app学习笔记十九--pages.json全局样式globalStyle设置
  • Langchaine4j 流式输出 (6)
  • NodeJS全栈开发面试题讲解——P2Express / Nest 后端开发
  • B站视频下载器 v1.0.4|免登录下载1080P视频
  • Global Security Markets 第5章知识点总结
  • 字节面试手撕题:版本号排序
  • ReLU的变体
  • 基于ZYNQ ARM+FPGA异构平台的声呐数据采集系统设计
  • Amazon Augmented AI:人类智慧与AI协作,破解机器学习审核难题
  • 【配置vscode默认终端为git bash】
  • ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案
  • (面试)OkHttp实现原理
  • AWS之迁移与传输服务
  • Java八股文智能体——Agent提示词(Prompt)
  • linux 后记
  • [总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析
  • 如何用docker部署ELK?
  • vue笔记-路由
  • Java抽象工厂模式详解
  • 【STM32F1标准库】理论——定时器/计数器中断
  • CMake指令:add_executable
  • 79. Word Search
  • flask pyinstaller打包exe,出现module not found问题
  • 论文阅读(六)Open Set Video HOI detection from Action-centric Chain-of-Look Prompting
  • 终结电源反接与压降损耗:理想二极管控制器深度解析
  • 4、数据标注的武林秘籍:Label-Studio vs CVAT vs Roboflow