news 2026/10/4 9:10:49

Crontab 定时任务:flock 防重入 + 加载 .env

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Crontab 定时任务:flock 防重入 + 加载 .env

背景
写了个 Python 脚本,每分钟往数据库写一次 CPU、内存数据:

* * * * * /usr/bin/python3 /home/YOUR_USER/app/write_db.py

手动跑没问题,但 Crontab 里跑总是失败。
原因
两个问题:
问题 1:Crontab 环境没有 .env 变量
write_db.py 里用 os.environ.get(“DB_ROOT_PASSWORD”) 读密码。手动跑时终端有这些变量,但 Crontab 是一个干净的环境,什么都没有。

问题 2:脚本可能堆积

如果某次脚本卡住(数据库慢、网络抖动),1 分钟后又起一个进程,10 分钟后堆积 10 个。
解决
第一步:加载 .env

* * * * * export $(cat /home/YOUR_USER/app/.env | xargs) && /usr/bin/python3 /home/YOUR_USER/app/write_db.py >> /home/YOUR_USER/app/write_db.log 2>&1

拆解:

export $(cat .env | xargs) → 把 .env 里的 KEY=VALUE 加载为环境变量

&& → 加载成功才执行后面的命令

log 2>&1 → 输出和错误都追加到日志

第二步:加锁防重入

* * * * * flock -xn /tmp/write_db.lock bash -c 'export $(cat /home/YOUR_USER/app/.env | xargs) && /usr/bin/python3 /home/YOUR_USER/app/write_db.py' >> /home/YOUR_USER/app/write_db.log 2>&1

flock -xn 含义:

-x → 排他锁

-n → 非阻塞(拿不到锁立即退出,不等待)

效果:上一次没跑完,这一次直接跳过。不会堆积。
第三步:验证

# 看 Crontab 生效 crontab -l # 等 1 分钟,看日志 tail -5 /home/YOUR_USER/app/write_db.log

预期:每分钟出现一条新记录。
测锁生效:

# 手动持锁 30 秒 flock -xn /tmp/write_db.lock sleep 30 & # 立刻再试一次(应该拿不到锁) flock -xn /tmp/write_db.lock echo "这行不该输出" echo "退出码: $?"

预期:第二行不输出,退出码是 1。
三个坑
坑 1:以为 Crontab 会继承用户环境

不会。Crontab 的环境极其干净,连 PATH 都跟登录 Shell 不一样。所有环境变量都要显式加载。

坑 2:export $(cat .env | xargs) 里 .env 有空格会炸

如果 .env 的值里有空格(比如 DB_DESC=my database),xargs 会把它拆成两个参数。.env 里尽量别写带空格的值。

坑 3:flock 的锁文件放 /tmp 就行

不用放项目目录——/tmp 重启会自动清,没有残留。而且不同脚本要用不同的锁文件(/tmp/scriptA.lock、/tmp/scriptB.lock),否则会互相阻塞。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 9:08:48

OpenRig:多智能体编程缺的那层控制平面

OpenRig:多智能体编程缺的那层控制平面 如果你同时开 Claude Code 和 Codex 干活,大概率见过这种场面:一个终端在重构,另一个在写测试,还口口声声说“基于最新代码”。二十分钟后,第一个智能体把文件挪走了…

作者头像 李华
网站建设 2026/10/4 9:05:45

Flutter三方库Modbus TCP在鸿蒙系统上的适配实践与踩坑记录

接到这个需求的时候,我正在给新产线的数据采集子系统做选型:设备是几台支持 Modbus TCP 的 PLC,加上一批传感器网关,上位机必须跑在鸿蒙系统的工控屏上,而界面层早就定了用 Flutter 来做,因为 Windows 上的…

作者头像 李华
网站建设 2026/10/4 8:59:54

都市供求信息网Java Web源码实战:从环境搭建到二次开发

简介:这份Java项目源码面向Java Web初学者与课程设计开发者,提供一套都市供求信息网的完整实现方案,可用于毕业设计参考、SSM/原生Servlet阶段练手或二次开发。项目采用前后台分离设计:前台覆盖信息列表与详情展示、分类浏览、定位…

作者头像 李华
网站建设 2026/10/4 8:57:47

插件机制详解:从IAR、Harness到MusicFree,排查加载失败的通用方法

上周在几个技术群里看同一类问题反复出现:有人说装完工具一启动就报failed to load plugins web boot: 2 entries did not activate,有人在问“iar plugins 是干什么的”,还有人在折腾musicfree plugins。表面看互不相干,骨子里都…

作者头像 李华