用 flock 给 cron 脚本加单实例锁,避免重复执行

举报
yd_291533083 发表于 2026/10/25 09:06:16 2026/10/25
【摘要】 cron 定时任务有个常见坑:脚本一次没跑完,下一次又启动了。两个进程同时写同一个文件、调同一个接口,轻则数据错乱,重则把服务搞挂。很多人用 pgrep 查进程名来判断上次是否还在跑,这办法不靠谱:进程名会误匹配,看门狗的子 shell、残留的孤儿进程都可能被算进去,严重时还会把自己杀掉。判断存活应该看锁,不看进程名。Linux 自带的 flock 就是干这个的。脚本开头加两行:exec 9...

cron 定时任务有个常见坑:脚本一次没跑完,下一次又启动了。两个进程同时写同一个文件、调同一个接口,轻则数据错乱,重则把服务搞挂。很多人用 pgrep 查进程名来判断上次是否还在跑,这办法不靠谱:进程名会误匹配,看门狗的子 shell、残留的孤儿进程都可能被算进去,严重时还会把自己杀掉。判断存活应该看锁,不看进程名。Linux 自带的 flock 就是干这个的。脚本开头加两行:exec 9>/var/lock/myjob.lock;flock -n 9 || exit 1。flock 是文件锁,锁跟着打开的文件描述符走,进程退出时锁自动释放,不怕残留。-n 表示拿不到锁就立即退出,不排队,适合定时巡检这种丢一轮也无所谓的任务;如果任务一轮都不能丢,去掉 -n,让它阻塞等锁。有两点容易踩:一是锁文件放哪都行,/var/lock 或 /tmp 均可,锁文件本身不重要,丢了重建就行,关键是持有锁的 fd 要贯穿整个脚本生命周期,别在子 shell 里开锁,用完即关。二是检查守护是否存活时,用 flock -n 锁文件 -c true 试拿锁:返回 0(能拿到)说明没有实例在跑,返回 1(拿不到)说明有实例持有锁。不要用 pgrep,原因同上。一句话总结:互斥靠 fd 不靠 pid 文件,存活判断看锁不看进程名。两行代码,就能让 cron 脚本不再自己跟自己打架。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。