用 cron 定时跑 Python AI 批处理:几个容易踩的坑

举报
yd_277333647 发表于 2026/11/07 10:58:46 2026/11/07
【摘要】 本地写好一个 Python AI 批处理脚本后,最自然的自动化方式就是交给 cron。它随 Linux 自带,配置简单,适合每天凌晨跑一次图片分类、文本清洗或模型推理任务。但 cron 的运行环境和登录 shell 差别很大,直接把手动命令抄进 crontab,十有八九会失败。下面以图片分类批处理为例,梳理几个关键点。假设项目在 /opt/ai-batch,虚拟环境在 venv,脚本 bat...

本地写好一个 Python AI 批处理脚本后,最自然的自动化方式就是交给 cron。它随 Linux 自带,配置简单,适合每天凌晨跑一次图片分类、文本清洗或模型推理任务。但 cron 的运行环境和登录 shell 差别很大,直接把手动命令抄进 crontab,十有八九会失败。下面以图片分类批处理为例,梳理几个关键点。

假设项目在 /opt/ai-batch,虚拟环境在 venv,脚本 batch.py 扫描 images 目录,把分类结果写入 result.csv。脚本内部用绝对路径读取目录,并在开头设置模型缓存位置:

python
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 添加:

text
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 批处理”跑通,理解绝对路径、环境变量、锁和日志这四个坑,再考虑替换方案,性价比更高。



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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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