用户级 systemd 服务是什么
systemd 支持每个用户一个独立实例,用 systemctl --user 管理 ~/.config/systemd/user/ 下的单元,服务以该用户身份运行,不需要 root 也不需要往 /etc/systemd/system 里塞文件。默认情况下用户实例随登录会话建立、随注销结束;要让服务在用户不登录时也常驻,必须用 loginctl enable-linger 打开 linger。它适合跑用户自有脚本、开发机上的常驻工具、以及不便申请 root 的信创终端程序。
基本信息
| 单元目录 | ~/.config/systemd/user/(全局用户单元在 /usr/lib/systemd/user/) |
|---|---|
| 管理命令 | systemctl --user start|enable|status 服务名 |
| 日志 | journalctl --user -u 服务名 |
| 免登录常驻 | loginctl enable-linger <用户名> |
| 权限要求 | 以该用户身份操作,无需 root;enable-linger 通常需 root 或授权 |
典型使用场景
- 无 root 权限的终端:把自研工具注册成用户服务,随开机自动拉起
- 开发机常驻进程:本地代理、同步脚本、构建守护用用户单元托管,日志统一进 journal
- 隔离与安全:业务以普通用户运行,避免 root 权限过大带来的风险
- 共享服务器:每个用户维护自己的服务清单,互不影响、便于清理
- 容器与远程登录环境:配合 linger 让用户服务在无人登录时持续提供能力
使用流程
使用流程
mkdir -p ~/.config/systemd/user
# 写 ~/.config/systemd/user/myapp.service,ExecStart 指向用户可执行文件
systemctl --user daemon-reload
systemctl --user enable --now myapp.service
systemctl --user status myapp.service --no-pager
loginctl enable-linger $USER # 免登录常驻,需按权限执行
loginctl show-user $USER | grep Linger # 确认 linger 已开启
journalctl --user -u myapp -n 50 --no-pager用户单元常用字段
| 字段 | 作用 | 注意事项 |
|---|---|---|
| ExecStart | 启动命令 | 路径用绝对路径,不依赖登录 shell 的 PATH |
| Restart=on-failure | 异常退出后自动重启 | 配合 RestartSec 控制重启间隔,避免疯狂重启 |
| WorkingDirectory | 工作目录 | 用户服务不继承登录目录,相对路径容易出错 |
| WantedBy=default.target | 开机自启目标 | 用户实例没有 multi-user.target,用 default.target |
| Environment= | 注入变量 | 用户单元不读 /etc/sysconfig,变量需显式声明 |
用户单元默认随会话结束而停止:不 enable-linger 时,登录退出会把服务一起带走,这是「手动跑正常、注销就断」的常见原因。
用户级服务不参与系统 target 排序,网络与文件系统未就绪就可能启动;依赖网络的单元要在单元里自行加等待或重试逻辑。