systemd服务详解
一、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 |
关机状态 |
七、故障排查清单
-
服务无法启动:用
systemctl status <服务>查看错误信息 -
开机不自启:检查
systemctl is-enabled <服务>和[Install]段配置 -
频繁重启:检查
Restart=策略和StartLimitBurst限制 -
日志爆量:用
journalctl -u <服务>查看日志,优化服务日志输出 -
修改不生效:执行
systemctl daemon-reload重新加载配置 -
依赖问题:用
systemctl list-dependencies <服务>排查依赖关系
总结
Systemd 是现代 Linux 发行版的标准初始化系统和服务管理器。其核心优势在于并行启动、按需激活、CGroup 资源管理和统一日志。通过编写 .service 单元文件和使用 systemctl 命令,可以以标准化、高效的方式管理所有系统服务,是替代传统 nohup、screen 和 SysV init 脚本的现代方案。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)