flock - 在 Shell 中管理文件锁

flock 用于在命令行或 Shell 脚本中管理建议锁,可避免多个进程同时执行同一段任务。锁会随文件描述符关闭而释放,因此通常不需要手动删除锁文件。

常用参数

  • -x--exclusive:获取独占锁,这是默认模式。
  • -s--shared:获取共享锁。
  • -n--nonblocking:无法立即获得锁时直接失败。
  • -w SECONDS--timeout SECONDS:等待指定时间后失败。
  • -E CODE--conflict-exit-code CODE:设置锁冲突或超时时的退出状态。
  • -o--close:执行命令前关闭锁文件描述符,避免子进程继续持有锁。

包裹单个命令

# 无法立即获得锁时返回,不重复执行任务
flock -n "$HOME/.cache/report-job.lock" /usr/local/bin/report-job
 
# 最多等待 10 秒
flock -w 10 "$HOME/.cache/report-job.lock" /usr/local/bin/report-job

锁文件所在目录必须已存在,并且当前用户具有写权限。

在脚本中锁定一段操作

exec 9>"$HOME/.cache/my-script.lock"
 
if ! flock -n 9; then
  echo "任务已在运行" >&2
  exit 1
fi
 
# 需要互斥执行的操作
printf '%s\n' "开始处理"

文件描述符 9 关闭时锁会自动释放。

注意事项

  • flock 是建议锁,访问同一资源的程序需要共同遵守锁约定。
  • flock 不检测死锁。
  • NFS、CIFS 等文件系统对文件锁的支持可能受服务端和挂载参数限制,使用前应在实际环境验证。

参考资料