用 cron 定时跑 Python AI 批处理:几个容易踩的坑
本地写好一个 Python AI 批处理脚本后,最自然的自动化方式就是交给 cron。它随 Linux 自带,配置简单,适合每天凌晨跑一次图片分类、文本清洗或模型推理任务。但 cron 的运行环境和登录 shell 差别很大,直接把手动命令抄进 crontab,十有八九会失败。下面以图片分类批处理为例,梳理几个关键点。
假设项目在 /opt/ai-batch,虚拟环境在 venv,脚本 batch.py 扫描 images 目录,把分类结果写入 result.csv。脚本内部用绝对路径读取目录,并在开头设置模型缓存位置:
import os from pathlib import Path from transformers import pipeline os.environ.setdefault("HF_HOME", "/opt/ai-batch/.cache") clf = pipeline("image-classification", model="google/vit-base-patch16-224") out = Path("/opt/ai-batch/result.csv") with out.open("w", encoding="utf-8") as f: for img in Path("/opt/ai-batch/images").glob("*.jpg"): top = clf(str(img))[0] f.write(f"{img.name},{top['label']},{top['score']:.4f}\n")
手动执行 /opt/ai-batch/venv/bin/python /opt/ai-batch/batch.py 正常后,再写 crontab。用 crontab -e 添加:
HF_HOME=/opt/ai-batch/.cache 0 3 * * * cd /opt/ai-batch && flock -n /tmp/ai-batch.lock ./venv/bin/python batch.py >> /var/log/ai-batch.log 2>&1
这里有几个细节。第一,必须写虚拟环境里 Python 的绝对路径,或者先 cd 再用相对路径,不能依赖 python 命令解析。第二,cron 的环境变量很精简,HF_HOME 这类模型缓存变量不会从用户配置里继承,最好在脚本内设置,或在 crontab 顶部显式声明。第三,命令里出现 % 时 cron 会特殊处理,需要转义;本例没有日期格式化,暂时不涉及。第四,flock -n 能防止上一轮任务没结束时又启动新任务,避免重复加载模型和写坏 CSV。第五,日志重定向到文件后,长期运行会越来越大,建议用 logrotate 按天切割并保留若干份。
失败处理也要考虑。脚本中应捕获异常并以非零状态退出,cron 本身不会提醒你,但可以通过邮件或外部监控读取退出码。入门阶段至少做到日志里能看到时间戳和错误堆栈,而不是只输出结果。若任务需要精确的时区或依赖网络,记得在 crontab 里设置 TZ,并确认机器时间同步正常。
cron 不是唯一选择,systemd timer 在日志和依赖管理上更现代。但对入门者来说,先用 cron 把“每天自动跑一次 AI 批处理”跑通,理解绝对路径、环境变量、锁和日志这四个坑,再考虑替换方案,性价比更高。
- 点赞
- 收藏
- 关注作者
评论(0)