user 级 systemd 服务每 5 分钟自己重启一次?先查登录会话,别急着找 cron
一个 systemctl --user 服务莫名每 5 分钟启动、十几秒后又停,反复刷屏。crontab -l 空的,systemctl --user list-timers 也没有对应 timer——那到底是谁在动它?
答案往往不是定时任务,而是 user 级服务的生命周期绑在 per-user systemd manager(user@<uid>.service)上。没开 linger 时,这个 manager 只在该用户"至少有一个登录会话"时存活:
- 有人(哪怕一条 2 秒的 SSH/rsync)登录 → manager 启动 → 到达
default.target→ 你那个WantedBy=default.target的服务被拉起。 - 会话退出约 10 秒后 → manager 拆除 → 服务跟着停。
- 下次登录再来一遍。
所以服务的"重启节奏"其实是登录节奏。用系统 journal 一看就露馅:
journalctl --since "-15min" | grep -iE "Accepted publickey|New session|Removed session|Reached target exit.target"
我这次的真凶是另一台机器上的 */5 * * * * rsync … host:/backup/…——每 5 分钟一条短 SSH 连接,把整个 user manager 点起来又放下。一旦本机有了常驻会话(比如一个挂着的 tmux),现象立刻消失——这就是最强的判定线索:只在"没人登录"时发生。
治本是让 manager 脱离登录、常驻:
sudo loginctl enable-linger <user>
# 确认
loginctl show-user <user> --property=Linger # Linger=yes
开 linger 后 manager 开机即起、不随会话退出而停,服务真正变成后台常驻。要让一个 user 级服务在无人登录时也长跑,enable --now 是不够的,enable-linger 才是前提。