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