Linux systemd 服务管理完全指南
systemd 是当今绝大多数 Linux 发行版默认的 init 系统和服务管理器。它取代了传统的 SysV init,提供了更快的启动速度、更清晰的依赖管理和更强大的日志系统。本文将全面介绍 systemd 的核心概念和日常使用技巧。
一、systemd 核心概念
1.1 什么是 Unit
systemd 将系统中的一切资源抽象为 Unit(单元)。每个 Unit 由一个配置文件定义,常见的 Unit 类型包括:
| Unit 类型 | 文件后缀 | 作用 |
|---|---|---|
| Service | .service | 守护进程/后台服务 |
| Socket | .socket | 进程间通信套接字 |
| Target | .target | 启动目标/运行级别 |
| Timer | .timer | 定时任务(替代 cron) |
| Mount | .mount | 文件系统挂载点 |
| Path | .path | 文件或目录路径监控 |
1.2 Unit 配置文件路径
systemd 按以下优先级加载 Unit 配置:
/etc/systemd/system/—— 管理员自定义(优先级最高)/run/systemd/system/—— 运行时配置/usr/lib/systemd/system/—— 软件包安装的默认配置
日常操作中,自定义服务文件应放在
/etc/systemd/system/目录下。
二、systemctl 命令详解
systemctl 是管理 systemd 服务的主要命令。
2.1 服务生命周期管理
1 | # 启动服务 |
2.2 Unit 列表查看
1 | # 列出所有运行中的服务 |
2.3 依赖关系管理
1 | # 查看某个服务的依赖 |
三、编写自定义 Service Unit
创建一个名为 myapp.service 的服务文件,放在 /etc/systemd/system/ 下。
3.1 基本结构
1 | [Unit] |
3.2 关键字段解析
[Unit] 部分
| 字段 | 说明 |
|---|---|
Description |
服务的描述信息 |
After |
在哪些 Unit 之后启动(不强制依赖) |
Requires |
强依赖,依赖的 Unit 启动失败时本服务不启动 |
Wants |
弱依赖,依赖的 Unit 启动失败不影响本服务 |
Before |
在哪些 Unit 之前启动 |
[Service] 部分
| 字段 | 说明 |
|---|---|
Type |
启动类型:simple、forking、oneshot、notify 等 |
ExecStart |
启动命令(绝对路径) |
ExecStop |
停止命令 |
ExecReload |
重载命令 |
Restart |
重启策略:no、on-success、on-failure、always |
RestartSec |
重启间隔秒数 |
User / Group |
运行服务的用户和组 |
Type 的选择
simple(默认):主进程直接在前台运行,systemd 认为服务已启动forking:进程 fork 后父进程退出,子进程继续运行(适用于传统 daemon)oneshot:执行一次即退出,常用于初始化任务notify:进程启动后通过sd_notify()通知 systemddbus:进程在 D-Bus 上注册后才认为启动完成
3.3 完整示例:Node.js Web 应用
1 | [Unit] |
应用服务文件后执行:
1 | sudo systemctl daemon-reload # 重载配置 |
四、日志查看 —— journalctl
systemd 的日志系统 journald 统一管理所有服务日志。
4.1 基本使用
1 | # 查看所有日志 |
4.2 日志优先级
1 | 0: emerg —— 系统不可用 |
4.3 日志管理
1 | # 查看日志占用磁盘空间 |
五、Timer —— systemd 的定时任务
systemd Timer 可以替代 cron,提供更精确的控制和更好的日志集成。
5.1 创建 Timer
创建一个执行备份脚本的 Timer:
/etc/systemd/system/backup.service
1 | [Unit] |
/etc/systemd/system/backup.timer
1 | [Unit] |
5.2 Timer 常用指令
1 | # 启用并启动 Timer |
5.3 OnCalendar 时间表达式
1 | Mon *-*-* 00:00:00 —— 每周一零点 |
六、Target —— 运行级别管理
Target 是 systemd 中的运行级别概念。
1 | # 查看当前默认运行级别 |
| Target | 对应 SysV 级别 | 说明 |
|---|---|---|
poweroff.target | 0 | 关机 |
rescue.target | 1 | 单用户维护模式 |
multi-user.target | 3 | 多用户命令行模式 |
graphical.target | 5 | 图形界面模式 |
reboot.target | 6 | 重启 |
七、实用技巧与排错
7.1 系统启动耗时分析
1 | # 查看系统启动总耗时 |
7.2 服务排错流程
当服务启动失败时,按以下步骤排查:
1 | # 1. 查看完整状态 |
7.3 环境变量传递
1 | # 方式一:在 Service 文件中使用 Environment 字段 |
7.4 设置 ulimit 限制
1 | [Service] |
7.5 开机自启失败排查
如果服务设置了 enable 但开机未启动,检查以下方面:
systemctl is-enabled myapp—— 确认启用状态systemctl list-dependencies myapp—— 检查依赖是否启动成功- 查看
journalctl -b—— 检查启动阶段日志 - 检查服务启动类型(
Type=oneshot时默认不会开机启动,需添加RemainAfterExit=yes)
八、常见问题解答
Q: 修改了 .service 文件后需要做什么?
A: 执行 sudo systemctl daemon-reload 重新加载配置。
Q: enable 和 start 有什么区别?
A: enable 设置开机自启(创建软链接),start 立即启动服务。
Q: mask 和 disable 有什么区别?
A: disable 只是移除开机自启,仍可手动启动。mask 将服务文件链接到 /dev/null,彻底阻止启动。
Q: journalctl 日志太大怎么办?
A: 配置 /etc/systemd/journald.conf 中的 SystemMaxUse 限制大小,或使用 journalctl --vacuum-time= 定期清理。
systemd 虽然初看有些复杂,但掌握核心概念后,你会发现它在服务管理、日志监控和定时任务方面远比传统 SysV + cron + syslog 的组合更强大和统一。希望这份指南能帮助你更好地管理 Linux 服务器上的服务。
本文由AI辅助生成,内容仅供参考
- 标题: Linux systemd 服务管理完全指南
- 作者: Someone
- 创建于 : 2026-06-07 00:25:00
- 更新于 : 2026-06-18 08:39:57
- 链接: https://demo-blog.qusite.cn/2026-06-07-systemd-guide/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。