一、Systemd 概述

Systemd 是 Linux 操作系统的 init 系统(初始化系统)和服务管理器。它负责在系统启动期间初始化系统、管理系统进程,并处理服务之间的依赖关系。Systemd 的设计强调并行化、速度以及管理服务和日志记录的统一方法

Systemd 的后台服务进程拥有一个特殊身份——它是系统中 PID 值为 1 的进程,由内核直接启动,所有其他进程直接或间接由它启动。

Systemd 的主要优势:

特性 说明
并行启动 尽可能并行启动服务,大幅缩短系统启动时间
按需启动 服务仅在真正被请求时才启动,而非开机无条件启动
CGroup 跟踪 使用控制组(cgroup)跟踪和管理进程生命周期,实现资源隔离与配额限制
统一日志 集成 Journald 日志服务,所有服务日志格式统一
依赖管理 确保服务以正确的顺序启动和停止

二、核心概念:Unit(单元)

Systemd 管理的基本对象是 Unit(单元)。Unit 由一个名称、类型和配置文件组成,用来定义和管理特定的系统任务。

常见的 Unit 类型

类型 后缀 用途
服务单元 .service 封装守护进程的启动、停止、重启和重载,最常用的一种
目标单元 .target 对 Unit 进行逻辑分组,替代 SysV 运行级别
套接字单元 .socket 管理网络套接字,实现按需服务激活
定时器单元 .timer 调度定时任务,替代传统的 Cron 作业
挂载单元 .mount 处理文件系统挂载点
路径单元 .path 监控目录或文件变化,触发其他 Unit 运行
设备单元 .device 管理硬件设备及其可用性
切片单元 .slice 表示 CGroup 树,用于资源分组管理

Systemd 总共支持 12 种 Unit 文件类型。


三、服务单元文件(.service)详解

服务单元文件是扩展名为 .service 的配置文件,定义了 systemd 如何控制和管理一个进程。

3.1 文件位置

目录 用途
/etc/systemd/system/ 自定义配置,优先级最高(管理员创建或修改)
/lib/systemd/system/ 软件包提供的默认配置(或 /usr/lib/systemd/system/

3.2 三段式结构

一个服务单元文件包含三个主要段落:

[Unit] 段 — 元数据与依赖
指令 说明
Description= 服务的简短描述
After= 定义服务在哪些 Unit 之后启动(排序约束)
Before= 定义服务在哪些 Unit 之前启动
Requires= 强依赖:依赖目标失败则本服务也失败
Wants= 弱依赖:依赖目标失败本服务仍启动
Conflicts= 定义冲突的 Unit
[Service] 段 — 服务运行行为
指令 说明
Type= 服务类型(见下文详解)
ExecStart= 启动服务的命令
ExecStop= 停止服务的命令
ExecReload= 重载配置的命令
Restart= 重启策略
RestartSec= 重启前的等待时间
User= / Group= 运行服务的用户/组
WorkingDirectory= 工作目录
PIDFile= PID 文件路径(Type=forking 时使用)
Environment= 设置环境变量
MemoryMax= 内存上限(超出则 OOM)
Type 类型详解
Type 说明
simple 默认值。ExecStart 启动的进程本身就是服务主进程
forking 传统守护进程,程序 fork 子进程后父进程退出,需配合 PIDFile=
oneshot 一次性任务,执行完即退出(常用于初始化脚本)
notify 程序通过 sd_notify 主动通知 systemd 已就绪(如 Nginx、PostgreSQL)
dbus 服务在 D-Bus 上注册后才视为就绪
idle 在所有其他任务完成后才执行
Restart 重启策略
说明
no 不自动重启(默认)
on-failure 推荐:非零退出码或被信号杀死时才重启
always 总是重启(包括正常退出)
on-success 成功退出(退出码为 0)时重启
on-abnormal 异常退出时重启

建议配合 StartLimitBurst=5 和 StartLimitIntervalSec=60s 限制重启频率,防止疯狂循环。

[Install] 段 — 开机自启配置
指令 说明
WantedBy= 指定服务被哪个 target 依赖,从而实现开机自启
RequiredBy= 强依赖方式的开机自启
Alias= 为服务设置别名

最常用的写法是 WantedBy=multi-user.target,表示在多用户模式下开机自启。

3.3 服务模板(Instantiated Services)

Systemd 支持通过 service@argument.service 语法创建实例化服务

  • 模板文件dhcpcd@.service(不带参数)

  • 实例服务dhcpcd@eth0.service(带具体参数)

在模板文件中,可以通过 %i 或 %I 等占位符访问实例名称。这对于管理多个相似服务(如每个网络接口一个 DHCP 客户端)非常有用。

3.4 服务单元文件示例

[Unit]
Description=My Custom Application Worker
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/venv/bin/python worker.py
Restart=on-failure
RestartSec=5s
StartLimitBurst=5
StartLimitIntervalSec=60s
MemoryMax=512M

[Install]
WantedBy=multi-user.target

四、服务管理命令(systemctl)

systemctl 是 Systemd 的核心管理工具。

4.1 基本服务操作

命令 说明
systemctl start <服务> 启动服务
systemctl stop <服务> 停止服务
systemctl restart <服务> 重启服务
systemctl reload <服务> 重载配置(不重启)
systemctl status <服务> 查看服务详细状态
systemctl enable <服务> 设置开机自启
systemctl disable <服务> 取消开机自启
systemctl is-enabled <服务> 检查是否已启用
systemctl mask <服务> 彻底屏蔽服务(无法启动)
systemctl unmask <服务> 解除屏蔽

4.2 查看与列表

命令 说明
systemctl list-units --type=service 列出当前活跃的服务单元
systemctl list-units --type=service --all 列出所有已加载的服务单元
systemctl list-unit-files --type=service 列出所有已安装的服务及启用状态
systemctl list-dependencies <服务> 查看服务的依赖关系

4.3 修改与重载

命令 说明
systemctl edit <服务> 创建或修改服务的 drop-in 配置
systemctl daemon-reload 重新加载所有 Unit 文件(修改后必须执行)

五、日志管理(journalctl)

Systemd 集成了 Journald 日志系统,所有服务日志统一收集和管理。

命令 说明
journalctl -u <服务> 查看特定服务的所有日志
journalctl -f 实时跟踪日志输出(类似 tail -f
journalctl --since "2026-01-01" --until "2026-01-02" 按时间范围过滤
journalctl -p warning 按日志级别过滤(emerg/alert/crit/err/warning/notice/info/debug)
journalctl -xe 查看详细日志(含说明)

六、高级特性

6.1 Socket 激活(按需启动)

Systemd 支持通过 Socket 单元实现按需激活:服务无需开机启动,当有网络连接到达对应 Socket 时才启动服务-。这进一步优化了系统资源利用-。

6.2 CGroup 资源限制

通过 CGroup,Systemd 可以直接限制服务的 CPU、内存等资源占用:

指令 说明
MemoryMax=512M 内存上限
CPUQuota=50% CPU 配额
TasksMax=100 最大进程数

6.3 Target(目标)

Target 是多个 Unit 的逻辑分组,作为系统启动的同步点。常见的 Target 包括:

Target 说明
multi-user.target 多用户模式(命令行)
graphical.target 图形界面模式
network.target 网络已基本可用
network-online.target 网络已完全可用(更稳健)
shutdown.target 关机状态

七、故障排查清单

  1. 服务无法启动:用 systemctl status <服务> 查看错误信息

  2. 开机不自启:检查 systemctl is-enabled <服务> 和 [Install] 段配置

  3. 频繁重启:检查 Restart= 策略和 StartLimitBurst 限制

  4. 日志爆量:用 journalctl -u <服务> 查看日志,优化服务日志输出

  5. 修改不生效:执行 systemctl daemon-reload 重新加载配置

  6. 依赖问题:用 systemctl list-dependencies <服务> 排查依赖关系


总结

Systemd 是现代 Linux 发行版的标准初始化系统和服务管理器。其核心优势在于并行启动按需激活CGroup 资源管理统一日志。通过编写 .service 单元文件和使用 systemctl 命令,可以以标准化、高效的方式管理所有系统服务,是替代传统 nohupscreen 和 SysV init 脚本的现代方案。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐