diff --git a/scripts/database-backup-to-oss.mjs b/scripts/database-backup-to-oss.mjs index 4b9031410..bc215509f 100644 --- a/scripts/database-backup-to-oss.mjs +++ b/scripts/database-backup-to-oss.mjs @@ -502,8 +502,12 @@ function acquireBackupLock({ workDir, database }) { ) { throw new Error(`已有数据库备份进程持有锁: ${lockPath} pid=${ownerPid}`); } + const staleLockPath = `${lockPath}.stale-${process.pid}-${attempt}-${Date.now()}`; try { - rmSync(lockPath); + // rename 是原子的:若另一个进程已先清理并重新建锁,这里只会得到 ENOENT, + // 不会把新进程的锁误删。 + renameSync(lockPath, staleLockPath); + rmSync(staleLockPath, { force: true }); console.log( `[database-backup] 已清理失效数据库备份锁,准备重新获取: ${lockPath} pid=${ownerPid || ''}`, );