flock是Linux基于文件描述符和内核advisory lock的轻量安全加锁工具,自动释放、作用域明确、原生集成、无需外部依赖;最常用写法为exec分配fd后flock -n加非阻塞锁。

Linux Shell 脚本加锁最常用、最可靠的方式就是 flock,它基于文件描述符和内核级的 advisory lock(建议性锁),轻量、安全、无需额外依赖,特别适合防止脚本并发重复执行。
flock 是什么?为什么选它?
flock 是 Linux 提供的命令行工具,封装了 fcntl(F_SETLK) 系统调用,对一个文件(通常是锁文件)加独占锁。它的核心优势是:
- 自动释放:进程退出(无论正常或被 kill)时,内核自动释放锁,不会死锁
- 作用域明确:锁绑定在文件描述符上,同一进程多次 flock 同一文件不冲突
- 支持脚本原生集成:可直接用重定向或 -c 方式包裹命令,写法简洁
- 不依赖外部服务(如 Redis、数据库),纯本地文件锁
最常用写法:给整个脚本加锁
在脚本开头用 flock 包裹主逻辑,推荐使用文件描述符方式(更健壮):
#!/bin/bash
exec 200> /var/lock/myjob.lock
flock -n 200 || { echo "Another instance is running. Exit."; exit 1; }
<h1>✅ 这里放你的实际任务(如备份、清理、推送等)</h1><p>echo "Job started at $(date)"
sleep 10
echo "Job done."</p><h1>✅ 脚本结束,fd 200 关闭 → 锁自动释放</h1><p>登录后复制
说明:
-
exec 200> ...:分配文件描述符 200 指向锁文件(仅创建/打开,不写内容) -
flock -n 200:尝试非阻塞加独占锁;失败立即报错退出(-n是关键,避免卡住) - 锁文件路径建议用
/var/lock/(需有写权限),避免放在/tmp(可能被清理)
按需加锁:只锁关键区段(非全脚本)
如果脚本较长,只想保护某一段临界区(比如写配置、更新数据库),可用子 shell + flock -c:
标签: linux redis app 工具 常见问题 作用域 shell脚本 为什么 red
还木有评论哦,快来抢沙发吧~