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 等文件系统对文件锁的支持可能受服务端和挂载参数限制,使用前应在实际环境验证。