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

云托管爬虫脚本被强制终止时,如何实现干净退出保障数据安全?

优雅退出与断点续爬的实现方案

要解决云服务6小时终止限制下的干净退出问题,核心是主动监听终止信号、原子化持久化进度与数据、及时清理资源,具体步骤如下:

  • 监听优雅终止信号
    云服务终止脚本时通常会发送SIGTERM信号(而非强制杀死的SIGKILL),在代码中注册信号处理逻辑,触发后立即停止新任务,进入收尾流程。以Python为例:

    import signal
    import sys
    
    exit_triggered = False
    
    def handle_termination(signum, frame):
        global exit_triggered
        exit_triggered = True
        print("收到终止信号,启动优雅退出流程")
    
    # 注册SIGTERM(云服务终止)和SIGINT(手动中断)信号
    signal.signal(signal.SIGTERM, handle_termination)
    signal.signal(signal.SIGINT, handle_termination)
    

    在抓取循环的每次迭代中检查exit_triggered状态,为True时立即跳出循环。

  • 定期原子化保存抓取进度
    不要等到全部任务完成才保存进度,每完成N个页面或固定时间间隔,就将已完成URL、当前处理的站点/分类等进度信息写入可靠存储(如SQLite或本地文件),且确保写入操作是原子的:

    import sqlite3
    import os
    
    def persist_progress(completed_urls, current_site):
        # 使用SQLite存储进度,支持事务
        conn = sqlite3.connect('scraper_progress.db')
        cursor = conn.cursor()
        # 初始化表(首次运行时)
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS progress (
                id INTEGER PRIMARY KEY,
                completed_urls TEXT,
                current_site TEXT
            )
        """)
        # 清空旧进度并写入新进度(或用UPDATE逻辑)
        cursor.execute("DELETE FROM progress")
        cursor.execute("INSERT INTO progress (completed_urls, current_site) VALUES (?, ?)",
                       (','.join(completed_urls), current_site))
        # 强制提交并同步到磁盘,避免缓存丢失
        conn.commit()
        conn.execute("PRAGMA synchronous = FULL")
        conn.close()
    

    脚本重启时,先读取此进度文件,跳过已完成的任务,从断点处继续抓取。

  • 原子化处理单条数据写入
    抓取单条数据时,确保写入操作要么完全成功,要么不留下残缺数据。比如用临时文件重命名(多数操作系统中重命名是原子操作):

    import json
    
    def save_scraped_item(item, output_file):
        temp_file = f"{output_file}.tmp"
        # 先写入临时文件
        with open(temp_file, 'w', encoding='utf-8') as f:
            json.dump(item, f, ensure_ascii=False)
        # 原子替换正式文件
        os.replace(temp_file, output_file)
    

    若中途被终止,只会留下完整的旧数据或临时文件(重启时可清理临时文件)。

  • 主动清理资源
    在退出流程中,主动关闭所有打开的资源,避免连接泄漏或数据缓存未写入:

    def cleanup_resources(session=None, db_conn=None):
        if session:
            session.close()
        if db_conn:
            db_conn.close()
        print("所有资源已清理完毕")
    

    跳出抓取循环后立即调用此函数,释放网络会话、数据库连接等资源。

  • 测试终止逻辑
    手动模拟云服务终止场景(如Linux下执行kill -TERM <脚本PID>),验证进度是否正确保存、数据是否完整、资源是否正常释放,确保逻辑可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:15:19