升级Heroku Build Pack 20后Scrapy爬虫中途触发SIGHUP退出如何解决
问题原因确认
你遇到的异常退出确实是Heroku交互式one-off dyno的SSH会话超时导致的:
- 日志中明确记录
Client connection closed. Sending SIGHUP to all processes,进程退出码129也对应SIGHUP信号触发的退出,和Build Pack 20升级无直接关联,属于你启动dyno的方式触发了平台默认限制。 - 这个超时是针对交互式终端连接的统计,不是针对dyno进程本身的运行限制:只有你本地和dyno的SSH连接闲置超过30分钟、或者因为网络波动断开时,才会触发该机制,和爬虫本身的运行状态无关。
不需要在爬虫代码中新增保活策略
该超时计数是Heroku平台层面统计SSH终端的输入输出活跃性,爬虫运行产生的日志不会刷新该超时计数,只有你在打开的shell窗口主动执行操作才会重置计数,因此在爬虫代码中添加任何保活逻辑都无法解决该问题。
可行解决方案
- 改用分离式one-off dyno启动爬虫:执行命令
heroku run:detached scrapy crawl main,这类dyno没有绑定交互式终端,不受SSH会话超时限制,单实例最长可运行24小时,足够覆盖绝大多数爬虫任务需求,运行日志可通过对应dyno的id查询。 - 若爬虫运行时长超过24小时,可改用worker类型dyno:在项目的Procfile中添加一行
worker: scrapy crawl main,之后启动worker dyno即可,只要账户资源额度充足,运行时长无24小时限制。 - 若确实需要使用交互式终端调试长时间运行的任务,可在dyno内安装tmux或screen这类终端复用工具,启动复用会话后再运行爬虫,即使本地SSH连接断开,会话内的进程也不会收到SIGHUP信号中断运行,需注意one-off dyno本身仍有24小时运行上限。
内容的提问来源于stack exchange,提问作者leeprevost
相关产品推荐
相关产品推荐

