首页/系统/信创系统运维速查/用户级 systemd 服务与 linger
服务与运维65 条

用户级 systemd 服务与 linger

以普通用户身份托管程序:systemctl --user 管理 ~/.config/systemd/user/ 下的单元;要让服务在用户不登录时也运行,需要 loginctl enable-linger。

信创系统运维速查系统更新于 2026-10-13

用户级 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 排序,网络与文件系统未就绪就可能启动;依赖网络的单元要在单元里自行加等待或重试逻辑。

易错点

  • sudo 或 su 切换用户后直接跑 systemctl --user 会报运行环境目录缺失:用 su - 或 machinectl shell 建立正确会话。
  • 没开 linger 就把服务当成开机自启,重启后无人登录时服务根本不跑,状态查询也看不到。
  • 用户单元不读 /etc/sysconfig 与系统级 EnvironmentFile 路径,照抄系统单元会导致变量缺失。
  • WantedBy 写成 multi-user.target 会让用户单元永远不被拉起:用户实例的默认目标是 default.target。
  • 以 root 身份把单元放进 /etc/systemd/system 后误用 --user 管理,两边状态互相看不见,排查时先确认在哪个实例里。

数据来源与参考

  • man 1 systemctl(--user)
  • man 1 loginctl(enable-linger)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌