如何把 Python 脚本配置为 cron 定时任务?
把 Python 脚本加到 cron:写好脚本 → crontab -e 添加定时行 → 注意用绝对路径和完整环境变量。本文给出完整步骤及常见坑。
步骤:写好 Python 脚本 → 用 crontab -e 编辑定时任务表 → 添加一行"分 时 日 月 周 命令",其中 Python 解释器和脚本都用绝对路径,输出重定向到日志文件。
第一步:准备脚本
# /home/user/scripts/cleanup.py
from pathlib import Path
# 使用自己拥有的专用目录,先预览;确认规则后再实现删除逻辑
dir_path = Path('/home/user/temp_files')
for f in dir_path.iterdir():
if f.is_file() and not f.is_symlink():
print(f"待清理: {f}")
第二步:添加到 crontab
crontab -e
添加一行(每天凌晨 0 点执行):
0 0 * * * /usr/bin/python3 /home/user/scripts/cleanup.py >> /home/user/cleanup.log 2>&1
关键注意事项
- 全部用绝对路径:cron 环境的 PATH 极简,
python3可能找不到,用which python3查到完整路径; - 虚拟环境:要用虚拟环境里的解释器,写它的绝对路径:
/home/user/venv/bin/python; - 工作目录:cron 有工作目录,常是用户家目录,但不一定与手动运行一致;用绝对路径或显式 cd 后执行;
- 环境变量:脚本依赖的环境变量(如 API Key)需在 crontab 顶部定义或脚本内显式设置;
- 输出重定向:
>> log 2>&1把输出和错误都写进日志,便于排查。
crontab 时间格式速查
┌ 分 (0-59)
│ ┌ 时 (0-23)
│ │ ┌ 日 (1-31)
│ │ │ ┌ 月 (1-12)
│ │ │ │ ┌ 周 (0-6, 0=周日)
* * * * * 命令
时间按 cron 实现与配置的时区解释,夏令时可能影响触发;长任务还应防止前一轮未完成时重叠运行。日志文件目录必须存在且运行用户可写。
常用例子:*/5 * * * * 每 5 分钟;0 */2 * * * 每 2 小时;0 9 * * 1-5 工作日早 9 点。
部署后给每次执行记录任务名、开始时间、结束时间和结果。日志已接入观测云时,按日志检测配置分别检查失败记录和超过预计完成窗口仍无结果的情况;日志没有更新也可能是路径或权限导致漏采,应先用一次手动执行验证采集。
常见问题(FAQ)
Q:脚本手动能跑、cron 里就不行?
A:常见原因是环境差异——检查绝对路径、环境变量、权限。可在受控日志中记录必要且不含密钥的环境信息,不要把完整环境变量写到共享临时目录。
Q:想在 Python 代码内部做调度而不是用系统 cron?
A:用 APScheduler 或 schedule 库,在进程内定时执行任务;但进程挂了任务就停,系统 cron 更可靠。
Q:如何确认 cron 任务有没有执行?
A:看 /var/log/syslog(Debian/Ubuntu)或 /var/log/cron(CentOS)中的 cron 守护进程记录;它只能证明触发过,还需脚本的完成记录与退出结果确认成功。