如何把 Python 脚本配置为 cron 定时任务?
把 Python 脚本加到 cron:写好脚本 → crontab -e 添加定时行 → 注意用绝对路径和完整环境变量。本文给出完整步骤及常见坑。
步骤:写好 Python 脚本 → 用 crontab -e 编辑定时任务表 → 添加一行"分 时 日 月 周 命令",其中 Python 解释器和脚本都用绝对路径,输出重定向到日志文件。
第一步:准备脚本
# /home/user/scripts/cleanup.py
import os
import glob
dir_path = '/tmp/temp_files/'
for f in glob.glob(os.path.join(dir_path, '*')):
os.remove(f)
print(f"已删除: {f}")
第二步:添加到 crontab
crontab -e
添加一行(每天凌晨 0 点执行):
0 0 * * * /usr/bin/python3 /home/user/scripts/cleanup.py >> /var/log/cleanup.log 2>&1
关键注意事项
- 全部用绝对路径:cron 环境的 PATH 极简,
python3可能找不到,用which python3查到完整路径; - 虚拟环境:要用虚拟环境里的解释器,写它的绝对路径:
/home/user/venv/bin/python; - 工作目录:cron 没有"当前目录"概念,脚本里的相对路径会出错,统一用绝对路径;
- 环境变量:脚本依赖的环境变量(如 API Key)需在 crontab 顶部定义或脚本内显式设置;
- 输出重定向:
>> log 2>&1把输出和错误都写进日志,便于排查。
crontab 时间格式速查
┌ 分 (0-59)
│ ┌ 时 (0-23)
│ │ ┌ 日 (1-31)
│ │ │ ┌ 月 (1-12)
│ │ │ │ ┌ 周 (0-6, 0=周日)
* * * * * 命令
常用例子:*/5 * * * * 每 5 分钟;0 */2 * * * 每 2 小时;0 9 * * 1-5 工作日早 9 点。
观测云对照
cron 任务的日志写入文件后,观测云 DataKit 可采集到平台统一检索;还可以配置监控器,在任务输出 ERROR 或日志长时间无更新(任务没跑)时告警。
常见问题(FAQ)
Q:脚本手动能跑、cron 里就不行?
A:90% 是环境问题——检查绝对路径、环境变量、权限。在 crontab 里临时加 * * * * * env > /tmp/cron-env.txt 可以查看 cron 的实际环境。
Q:想在 Python 代码内部做调度而不是用系统 cron?
A:用 APScheduler 或 schedule 库,在进程内定时执行任务;但进程挂了任务就停,系统 cron 更可靠。
Q:如何确认 cron 任务有没有执行?
A:看 /var/log/syslog(Debian/Ubuntu)或 /var/log/cron(CentOS)中的 cron 守护进程记录。