如何让部署在Heroku的Python脚本仅按计划时间运行?
解决Heroku上Python定时脚本额外运行的问题
你的问题核心在于用Web进程来运行定时任务,再加上Heroku的默认机制,才导致了脚本频繁额外启动。下面给你一步步梳理解决方案:
1. 把Web进程改成Worker进程
Heroku的web进程是专门用来处理HTTP请求的,平台会定期对它做健康检查——如果你的脚本没有监听HTTP端口,Heroku会判定进程异常,反复重启它,这就是额外运行的主要诱因。
修改你的Procfile内容为:
worker: python my_script.py
2. 调整Heroku进程的缩放配置
现在需要彻底禁用原来的Web进程,只启动一个Worker进程:
在终端执行这条命令:
heroku ps:scale web=0 worker=1
这样就只会有一个Worker实例在后台运行,不会再因为Web进程的健康检查触发重复启动。
3. 核对Heroku Scheduler的定时规则
打开Heroku后台的Scheduler插件,仔细检查:
- 是不是只添加了一条每日运行的任务,有没有重复创建的定时规则
- 任务的触发时间和命令是否正确,有没有误设置成高频触发的规则
4. 检查脚本自身的逻辑
确认你的脚本里没有以下可能导致重复执行的代码:
- 无限循环(比如
while True)结构,让脚本在单次启动后反复执行任务 - 异常捕获后自动重启整个脚本的逻辑
- 脚本内部自带的定时触发代码(比如用
time.sleep循环执行,这会和Scheduler的定时规则冲突)
5. 查看日志精准定位问题
如果还是有异常,用Heroku日志命令排查每次启动的触发源:
heroku logs --tail
从日志里你能清楚看到每次进程启动的原因——是Scheduler触发的正常任务,还是dyno自动重启,或是其他异常导致的重启,方便你精准解决问题。
内容的提问来源于stack exchange,提问作者Gokul nath
相关产品推荐
相关产品推荐

