|
62 | 62 | | `/run/systemd/system/` | 运行时动态生成 | |
63 | 63 | | `/usr/lib/systemd/system/` | 发行版/软件包自带 | |
64 | 64 | | `/lib/systemd/system/` | 同上(部分发行版) | |
| 65 | +| `~/.config/systemd/user/` | 当前用户自定义的 **user unit**(仅当前用户可见) | |
| 66 | +| `/etc/systemd/user/` | 系统范围提供的 **user unit**,供各用户实例加载 | |
| 67 | +| `/usr/lib/systemd/user/` | 发行版/软件包自带的 **user unit** | |
65 | 68 |
|
66 | 69 | > ⚠️ 优先级:`/etc/` > `/run/` > `/usr/lib/` |
67 | 70 |
|
| 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 | + |
68 | 122 | ### 📝 Service Unit 文件模板 |
69 | 123 |
|
70 | 124 | ```ini |
@@ -197,6 +251,15 @@ systemctl list-timers --all # 包含不活跃的 |
197 | 251 | systemd-analyze calendar "*-*-* 02:00:00" # 验证日历表达式 |
198 | 252 | ``` |
199 | 253 |
|
| 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 | + |
200 | 263 | --- |
201 | 264 |
|
202 | 265 | ## 四、journalctl — 日志管理 |
@@ -365,6 +428,20 @@ sudo systemctl restart myapp |
365 | 428 | sudo systemctl edit myapp # 创建 /etc/systemd/system/myapp.service.d/override.conf |
366 | 429 | ``` |
367 | 430 |
|
| 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 | + |
368 | 445 | --- |
369 | 446 |
|
370 | 447 | > 💡 **提示**:大多数 `systemctl` 命令支持 Tab 补全,安装 `bash-completion` 包即可使用。 |
0 commit comments