Skip to content

Commit cdeb561

Browse files
committed
docs(systemd): 添加用户服务与系统服务对比及使用指南
完善 systemd 文档,新增用户服务相关内容: - 详细说明用户单元文件路径(~/.config/systemd/user/ 等) - 对比系统服务与用户服务的差异和适用场景 - 补充用户服务操作命令示例(--user 参数) - 添加用户服务启用 linger 的说明 - 增加完整的用户服务创建流程示例 - 扩展 timer 和日志查看的相关内容
1 parent d2e258b commit cdeb561

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

docs/cheatsheet/linux/services/systemd.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,63 @@
6262
| `/run/systemd/system/` | 运行时动态生成 |
6363
| `/usr/lib/systemd/system/` | 发行版/软件包自带 |
6464
| `/lib/systemd/system/` | 同上(部分发行版) |
65+
| `~/.config/systemd/user/` | 当前用户自定义的 **user unit**(仅当前用户可见) |
66+
| `/etc/systemd/user/` | 系统范围提供的 **user unit**,供各用户实例加载 |
67+
| `/usr/lib/systemd/user/` | 发行版/软件包自带的 **user unit** |
6568

6669
> ⚠️ 优先级:`/etc/` > `/run/` > `/usr/lib/`
6770
71+
### 👥 系统服务 vs 用户服务
72+
73+
systemd 实际上有两类常见运行域:
74+
75+
- **系统服务(system service)**:由 PID 1 管理,常用 `systemctl <command>` 操作。
76+
- **用户服务(user service)**:由某个用户自己的 systemd 实例管理,常用 `systemctl --user <command>` 操作。
77+
78+
| 维度 | 系统服务 | 用户服务 |
79+
|------|----------|----------|
80+
| 管理者 | 系统级 systemd(PID 1) | 当前用户的 systemd 实例 |
81+
| 常见 unit 路径 | `/etc/systemd/system/` | `~/.config/systemd/user/` |
82+
| 常见命令 | `systemctl start nginx` | `systemctl --user start my-agent` |
83+
| 日志查看 | `journalctl -u nginx` | `journalctl --user -u my-agent` |
84+
| 权限边界 | 通常需要 `sudo`;可在 unit 内再切换 `User=` | 默认只能代表当前用户运行 |
85+
| 生命周期 | 跟随系统启动/停止,不依赖用户登录 | 默认跟随用户会话;退出登录后通常会结束 |
86+
| 开机自启 | 适合系统启动后立即拉起 | 适合登录后或启用 lingering 后拉起 |
87+
| 典型资源范围 | 系统目录、低端口、设备、挂载、系统网络 | 用户家目录、桌面会话、个人开发工具 |
88+
89+
### 🧭 典型使用场景
90+
91+
**更适合系统服务的场景:**
92+
93+
- Web API、数据库、反向代理、队列消费者等长期后台服务
94+
- 需要在**没人登录**时也持续运行的进程
95+
- 需要访问 `/var/lib``/var/log``/etc`、块设备、挂载点、系统网络配置的任务
96+
- 需要监听低端口(如 `80` / `443`)或和其他系统服务建立启动依赖的程序
97+
- 机器级定时任务,例如备份、日志轮转、磁盘巡检、系统同步
98+
99+
**更适合用户服务的场景:**
100+
101+
- 某个开发者自己的同步、代理、通知、常驻 CLI helper、个人守护进程
102+
- 配置和数据都放在用户家目录下,不希望引入 `sudo`
103+
- 每个用户都可能有自己的一份实例,互不干扰
104+
- 个人定时任务,例如同步 dotfiles、定时拉代码、清理下载目录
105+
106+
### ⚠️ 用户服务最容易忽略的一点
107+
108+
如果用户服务需要在**退出登录后继续运行**,通常还要启用 lingering:
109+
110+
```bash
111+
sudo loginctl enable-linger <user>
112+
```
113+
114+
否则很多发行版上,用户会话结束后,该用户的 systemd 实例也会被回收。
115+
116+
### ✅ 选型建议
117+
118+
- 你在做“机器上的正式服务”时,优先选 **系统服务**
119+
- 你在做“某个用户自己的后台工具”时,优先选 **用户服务**
120+
- 如果一个工具既想服务服务器部署,也想服务开发者本地常驻工具,最好同时支持两种模式
121+
68122
### 📝 Service Unit 文件模板
69123

70124
```ini
@@ -197,6 +251,15 @@ systemctl list-timers --all # 包含不活跃的
197251
systemd-analyze calendar "*-*-* 02:00:00" # 验证日历表达式
198252
```
199253

254+
用户级 timer 的命令形式相同,只是改为 `--user`
255+
256+
```bash
257+
systemctl --user start mybackup.timer
258+
systemctl --user enable mybackup.timer
259+
systemctl --user list-timers
260+
journalctl --user -u mybackup.service -f
261+
```
262+
200263
---
201264

202265
## 四、journalctl — 日志管理
@@ -365,6 +428,20 @@ sudo systemctl restart myapp
365428
sudo systemctl edit myapp # 创建 /etc/systemd/system/myapp.service.d/override.conf
366429
```
367430

431+
```bash
432+
# 👤 创建一个新的用户服务(完整流程)
433+
mkdir -p ~/.config/systemd/user
434+
vim ~/.config/systemd/user/my-agent.service # 1. 编写 user unit
435+
systemctl --user daemon-reload # 2. 重载用户级配置
436+
systemctl --user start my-agent # 3. 启动测试
437+
systemctl --user status my-agent # 4. 检查状态
438+
systemctl --user enable my-agent # 5. 设置用户级自启
439+
journalctl --user -u my-agent -f # 6. 查看实时日志
440+
441+
# 如需退出登录后继续运行,再启用 lingering
442+
sudo loginctl enable-linger "$USER"
443+
```
444+
368445
---
369446

370447
> 💡 **提示**:大多数 `systemctl` 命令支持 Tab 补全,安装 `bash-completion` 包即可使用。

0 commit comments

Comments
 (0)