防止脚本并发冲突最稳妥的方式是用 flock 加文件锁:通过 exec 分配文件描述符并配合 -n 非阻塞选项实现自动加锁与进程退出自动解锁,避免伪锁和死锁,适用于本地单机场景。

防止脚本并发冲突,核心是让多个进程互斥访问关键逻辑——最稳妥、轻量、原生的方式就是用 flock 加文件锁。它不依赖外部服务,进程退出自动释放,不会死锁,适合绝大多数 Shell 场景。
用 flock 给整个脚本加锁(推荐)
这是最简洁可靠的写法,把锁绑定到文件描述符上,脚本结束自动解锁:
- 在脚本开头加:
exec 200>/tmp/my_script.lock && flock -n 200 || { echo "脚本已在运行"; exit 1; } -
exec 200>...分配一个稳定的文件描述符(如 200),避免与其他 fd 冲突 -
-n表示非阻塞:拿不到锁立刻报错退出,不卡住 - 无需手动
flock -u或trap,进程终止时内核自动关闭 fd 并释放锁
用 flock 包裹单条命令(适合简单任务)
如果只是临时保护某段逻辑(比如一段 curl 或数据库操作),可直接用命令式调用:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
flock -n /tmp/update.lock -c 'curl -s http://api.example.com/refresh'- 成功拿到锁才执行
-c后的命令;失败则返回非零退出码,可用于条件判断 - 注意:锁文件路径必须一致,且所有实例都用同一路径,否则互斥失效
避免“伪锁”:别只靠文件存在性判断
仅靠 touch /tmp/lock && rm /tmp/lock 这类检查+创建方式是不安全的:
- 两个进程几乎同时
test ! -f都返回 true,接着都touch,锁就形同虚设 - 异常退出时锁文件残留,需额外加
trap "rm -f /tmp/lock" EXIT INT TERM,但仍有竞态风险 - flock 的原子性由内核保证,不存在检查与创建之间的窗口期
进阶提醒:跨主机或长周期场景需换方案
flock 是本地文件锁,只对同一台机器上的进程有效:
- 多节点部署?考虑 Redis 分布式锁(如
SET lock_key 1 NX EX 30) - 脚本会 fork 出后台 daemon?确保子进程关闭了锁 fd(
exec 200>&-),否则锁无法释放 - 锁文件建议放在
/tmp或/var/run,避免挂载点不可写导致失败










