You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Heroku Scheduler结合curl命令定时执行pg:killall清除Postgres事务中卡住的空闲连接

解决方案:用Heroku Scheduler + curl定时执行pg:killall

Hey Bobby, 很高兴能帮你解决这个问题!针对你想在dynos重启30分钟后清除卡住的数据库连接需求,其实完全可以通过Heroku Scheduler + curl调用Heroku API实现,而且不需要复杂的Python脚本,刚好避开你提到的超级用户权限问题。下面是具体的实现步骤:

一、核心思路:两个独立的定时任务

你已经在使用Heroku Scheduler定时重启dynos,只需要再添加一个延迟30分钟的任务,专门执行pg:killall操作。Heroku的pg:killall命令是平台封装好的,不需要你拥有Postgres超级用户权限,它会帮你安全地终止所有卡住的空闲连接(包括事务中的)。

二、具体curl命令实现

你可以用curl直接调用Heroku平台API来执行pg:killall命令,和你重启dynos的逻辑类似。需要用到你的Heroku API令牌,以及目标应用的名称:

  1. 获取你的Heroku API令牌:可以在Heroku账户设置里找到,或者通过heroku auth:token命令在本地终端获取。
  2. 构造curl命令:
curl -X POST \
  -H "Authorization: Bearer $HEROKU_API_KEY" \
  -H "Content-Type: application/json" \
  https://api.heroku.com/apps/你的应用名称/ps/exec \
  -d '{
    "command": "heroku pg:killall --app 你的应用名称",
    "attach": false
  }'

三、在Heroku Scheduler中配置任务

  1. 打开Heroku Dashboard,进入你的应用,找到Scheduler插件。
  2. 添加一个新的定时任务:
    • 选择合适的频率(比如和你重启dynos的频率一致,但时间延后30分钟)
    • 把上面的curl命令粘贴进去,注意替换你的应用名称,并且在Scheduler的环境变量里设置HEROKU_API_KEY(避免明文暴露令牌)
  3. 保存任务即可。

四、注意事项

  • 时区设置:确保Heroku Scheduler的时区和你重启dynos的时区一致,避免时间偏差导致任务执行时机不对。
  • 测试验证:先手动执行一次curl命令,确认pg:killall能正常清除卡住的连接,再配置到Scheduler中。
  • 关于pg:killall的影响:这个命令会终止所有数据库连接,但你是在dynos重启30分钟后执行,此时旧的dynos已经关闭,新的dynos建立的连接都是正常的,所以不会影响正常业务。

为什么不用Python脚本?

正如你所说,Heroku Postgres不提供超级用户权限,用Python脚本需要查询pg_stat_activity视图,然后手动终止连接,这不仅需要处理权限限制,还要过滤出真正卡住的连接,逻辑复杂且容易出错。而直接调用Heroku的pg:killall命令是最简洁可靠的方式,平台已经帮你处理了权限和连接筛选的问题。

内容的提问来源于stack exchange,提问作者Bobby Gindal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:47:44