记录一下那天晚上的排查过程。阿里云 4 核 8G 的 CentOS 7.9 上用 restic 0.16 把 /data 备到 OSS,前一天凌晨任务被 kill,第二天报 unable to create lock in backend: repository is already locked by PID 21871,ps 里根本找不到这个进程。

这类报错背后常见的原因有几处,逐个排除就行。上次备份被信号杀掉,locks 目录里的锁文件没人清,restic 不按 PID 存活判断过期。少数情况下是两台机器指向同一个仓库却没设 –host,锁记录的主机名与当前机器不同,unlock 也认不出来。

另外,备份脚本外面包了一层 timeout,超时后只杀了父进程,子进程的解锁逻辑没执行。

先把仓库里的锁列出来看时间

restic -r $REPO list locks

然后清掉过期锁再重试备份

restic -r $REPO unlock && restic -r $REPO backup /data

多机共库时给每台机独立 host

restic -r $REPO backup --host web01 /data

等前面都确认过,再让备份自己等锁而不是失败

restic -r $REPO backup --retry-lock 10m /data

别只看报错消失,验证要多做一步。restic list locks 输出为空,备份退出码为 0,snapshots 里出现当天新 ID 且文件数与上一次相差不到百分之五。

unlock 会把正在跑的备份锁也清掉,多台机共用一个仓库时务必靠 –host 区分,不然 prune 可能删掉别人的快照。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189