首页 / 新闻资讯 / 技术教程

Linux 文件锁与并发写入:flock 的正确用法

2026-07-07分类:技术教程管理员

## 概念是什么

多个进程同时写同一个文件或同一份资源时,互相踩踏会产出损坏的结果:定时任务上一轮还没跑完下一轮又启动,日志被多个写入者切成碎片。flock 是操作系统提供的文件级排他机制,谁先拿到锁谁干活,后来者要么等待要么直接退出,从根上消灭重入。

## 背后原理

锁绑定在文件描述符上,对一个锁文件加锁,持锁期间其他进程对同一文件加锁会失败或阻塞。两种模式对应两种策略:等待模式排队依次执行,非阻塞模式抢不到就退出,适合定时任务防重入。锁的生命周期与进程一致,进程退出哪怕异常崩溃,内核自动释放锁,不会出现死锁残留。

## 最小实操

命令行场景直接在 crontab 的命令外面包一层,锁文件放在临时目录,n 参数是非阻塞标志,抢不到锁就静默退出,本轮放弃。

flock -n /tmp/backup.lock /usr/local/bin/backup.sh

代码层面的用法是打开锁文件后调用 flock 调用加锁,配合非阻塞标志判断返回值,拿不到锁就走退出分支。

fd = open("/tmp/job.lock", "w")
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)

## 常见错误

锁文件路径各进程写得不一致,等于各锁各的,毫无防护效果,路径要集中定义。有人习惯先杀旧进程再启动新的来防重入,这与锁相比既不安全也不可靠。顺云云服务器上多机协作的任务,单机文件锁管不到别的机器,跨机互斥需要改用集中式的锁服务或队列串行化。

还有一个进阶话题:锁的粒度设计。整个任务用一把锁最简单,但任务内部多个子步骤互不冲突时,可以按资源分锁,按域名、按分片各锁各的,并行度立刻上去。反过来,嵌套加锁要极其小心,两把锁的获取顺序不一致就是死锁的教科书配方,能不嵌套就不嵌套。锁文件不需要清理,空文件长期存在没有代价,删除反而引入竞争窗口。定时任务的日志里建议记录每次是否真正获得锁,被跳过的记录同样有价值,频率异常时能第一时间发现。

技术教程