首页/系统/Linux 运维命令速查/systemctl --user 用户级单元
systemd 与服务42 条

systemctl --user 用户级单元

普通用户自己的服务与定时器:单元放 ~/.config/systemd/user/,journalctl --user 查看;不用 sudo 也能给个人任务做守护与开机自启。

Linux 运维命令速查系统更新于 2026-10-13

用户级单元解决什么

systemctl --user 管理用户空间的服务与定时器:单元放在 ~/.config/systemd/user/,日志用 journalctl --user 查看,不需要 sudo 就能给个人任务做守护、开机自启与失败重启。与系统级单元的两点关键差异是权限边界(以该登录用户身份运行,默认不能绑低端口)与生命周期(跟随登录会话,退出即停,需要常驻则开启 linger)。

基本信息

适用平台Linux(systemd 用户实例;SSH 登录环境通常已具备)
单元路径~/.config/systemd/user/(系统还提供 /etc/systemd/user/、/usr/lib/systemd/user/)
常用命令systemctl --user daemon-reload / status / enable --now
日志journalctl --user -u 单元名
常驻开关loginctl enable-linger 用户名
路径变量%h 展开为用户家目录

典型使用场景

  • 开发机、跳板机上跑个人守护进程,不动系统配置也不申请 root
  • 服务账号(如 deploy)自己管理数据同步与清理任务
  • 用户级 timer 定时拉取制品、刷新缓存
  • 无系统权限的小工具需要失败自动重启(Restart=on-failure)
  • 多用户共享同一台机器时各自隔离任务,互不干扰

创建与常驻

创建与常驻
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/my-worker.service <<'EOF'
[Unit]
Description=my worker

[Service]
ExecStart=%h/bin/worker.sh        # 用 %h 展开家目录,避免写死绝对路径
Restart=on-failure                # 失败自动拉起
RestartSec=5

[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload
systemctl --user enable --now my-worker
systemctl --user status my-worker --no-pager | head -n 15
journalctl --user -u my-worker -n 20 --no-pager
sudo loginctl enable-linger deploy        # 退出登录后仍常驻,否则登出即停
loginctl show-user deploy | grep -i linger   # 复核 linger 状态

用户级与系统级对照

维度systemctl --usersystemctl(系统级)
单元路径~/.config/systemd/user//etc/systemd/system/
运行身份该登录用户单元内 User= 指定,默认 root
生命周期随会话结束而停止(除开启 linger)系统运行期间持续
开机自启WantedBy=default.targetWantedBy=multi-user.target
日志journalctl --user -ujournalctl -u
权限不能操作系统单元,默认不能监听低端口可监听低端口(以 root 运行时)
用户单元不加载 ~/.bashrc 之类登录脚本,环境变量要么在单元里用 Environment= 声明,要么在 ExecStart 里写绝对路径,PATH 也不能假设与交互式 shell 一致。
用户级 timer 的写法与系统级完全一致:把 .timer 放进 ~/.config/systemd/user/,daemon-reload 后 systemctl --user enable --now 即可;排查同样先看同名 service 的日志。
没有开启 linger 时,用户最后一次会话退出会终止全部用户级单元,现象是“服务莫名停了且看不到明显的结束原因”;需要长期运行的任务必须显式 loginctl enable-linger。

易错点

  • 把用户单元当成系统服务用:会话一断就停,日志里也没有显式报错,容易长期误判
  • 在单元里依赖 shell 初始化脚本设置环境变量:不加载 .bashrc,脚本因此报命令找不到
  • ExecStart 里使用 ~ 或相对路径:不会按预期展开,必须写绝对路径或用 %h
  • systemctl --user 报连不上 user manager:常见原因是缺少用户级 systemd 实例或 user@UID.service 异常,先查该单元状态再怀疑自己的 unit

数据来源与参考

  • man 1 systemctl(--user)
  • systemd 官方文档:user units

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌