约 8431 字

约 42 分钟

#Bash 的 flock 命令

flock [OPTIONS]

功能

管理文件的锁。

类型

可执行文件(/usr/bin/flock),属于 util-linux。

参数

  • OPTIONS 选项:
    • -c, --command command 通过 -c 将一个单独命令(不带参数)传递给 shell 执行。

    • -E, --conflict-exit-code number 当使用 -n(非阻塞)且锁冲突,或使用 -w(等待超时)且超时未获取锁时,指定返回的退出状态码。

    • 默认值为 1

    • 可用范围:0~255

    • -F, --no-fork 执行命令前 不 fork,flock 进程直接被命令替换,并继续持有锁。

    • 与 --close 不兼容,否则没有进程持锁。

    • -e, -x, --exclusive 获取独占锁(也称写锁),这是默认模式。

    • -n, --nb, --nonblock 如果锁无法立即获取,则直接失败而不等待。

    • 返回值可通过 -E 指定

    • -o, --close 在执行命令前关闭持锁的文件描述符。

    • 适用于命令生成子进程时,让子进程不持锁

    • -s, --shared 获取共享锁(也称读锁)。

    • -u, --unlock 释放锁。通常不需要手动调用,因为文件关闭时锁会自动释放。

    • 特殊情况需要,例如命令内部可能 fork 背景进程,不希望其持锁

    • -w, --wait, --timeout seconds 在指定秒数内未获取锁则失败。

    • 支持小数秒

    • 返回值可通过 -E 指定

    • 秒数为 0 时等同于 --nonblock

    • --verbose 输出获取锁所花的时间,或者说明无法获取锁的原因。

    • --help - 显示帮助

    • --version - 显示版本

#示例

阻塞式加锁

$ flock /tmp/lockfile -c "echo '任务开始'; sleep 5; echo '任务结束'"    # 加锁然后执行命令
任务开始
任务结束
  • 如果文件已经被其它进程加锁,则会阻塞到锁释放
  • flock 结束时自动释放锁

非阻塞式加锁

$ flock -n /tmp/lockfile -c "echo '任务开始'; sleep 5; echo '任务结束'"    # 加锁然后执行命令
任务开始
任务结束
  • 如果文件已经被其它进程加锁,则会直接返回失败(不等的也不执行命令)
  • flock 结束时自动释放锁

在脚本内加锁一段时间

#!/bin/bash
exec 200 > /tmp/lockfile        # 打开文件并指定文件描述符为 200 
flock 200                       # 加锁

echo "任务开始"
sleep 10
echo "任务结束"
  • 脚本退出时,文件描述符 200 关闭,自动释放锁
  • 也可以通过 flock -u 200 提前释放锁,或通过 exec 200>&- 关闭文件来释放锁

#推荐阅读

#手册

更新: 2026/1/18

作者: PlanC

创建: 2026/1/15