You need to enable JavaScript to run this app. 如何实现VPN网络恢复后Python脚本自动断点续跑 无需人工干预
优惠活动
大模型
产品
解决方案
定价
更多

如何实现VPN网络恢复后Python脚本自动断点续跑 无需人工干预

断连场景下脚本自动续跑的优化方案

原实现的核心缺陷

当前的外层循环仅实现了“进程退出后反复拉起”的基础逻辑,存在两个无法支撑断点续跑的关键问题:

  • 没有对退出场景做区分:无论是VPN断连、代码报错、正常完成任务,循环都会无条件拉起进程,既可能在VPN未恢复时空跑,也可能在脚本正常完成后无意义重启
  • 没有留存任何执行进度状态:xyz.py本身没有设计断点读取逻辑,即使外层监控能正确拉起进程,脚本依然会从头开始执行,完全达不到续跑的效果。

分层优化实现细节

1. 外层监控脚本的逻辑修正

替换原有存在缺陷的循环逻辑,核心改动包括:

  • 取消存在安全隐患的shell命令拼接方式,改用参数列表形式调用子进程,避免命令解析异常
  • 精准匹配VPN断连对应的常见错误特征(比如Windows平台socket连接超时类错误),仅对断连类错误做重启重试
  • 增加重启前的网络连通性校验,避免VPN尚未恢复时反复空跑脚本

优化后的参考代码:

import subprocess
import time
import socket

SCRIPT_NAME = "xyz.py"
VPN_TARGET_IP = "192.168.1.1"  # 替换为VPN内网可连通的固定IP
RETRY_INTERVAL = 30  # 断连后每30秒检查一次网络连通状态
# 常见网络断连对应的进程退出码
NETWORK_ERROR_CODES = (10054, 10060, 11001)

def check_vpn_connect():
    """校验VPN是否恢复连通"""
    try:
        socket.setdefaulttimeout(5)
        socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((VPN_TARGET_IP, 443))
        return True
    except:
        return False

while True:
    proc = subprocess.Popen(
        ["python", SCRIPT_NAME],
        shell=False,
        text=True
    )
    proc.wait()
    exit_code = proc.returncode

    # 脚本正常执行完成,直接退出监控
    if exit_code == 0:
        break

    # 匹配到网络断连类错误,等待VPN恢复后再拉起脚本
    if exit_code in NETWORK_ERROR_CODES:
        while not check_vpn_connect():
            time.sleep(RETRY_INTERVAL)
        continue

    # 其他类型错误可按需配置重试次数或直接终止
    continue

2. xyz.py 内部的断点续跑逻辑改造

要实现真正的断点续跑,必须在xyz.py自身加入即时进度持久化逻辑,不能完全依赖外层监控:

  • 在脚本初始化阶段,首先读取本地存储的进度校验文件,获取上次中断时的执行位置
  • 每完成一个独立的执行节点,立刻把最新的进度标识写入校验文件,避免断连时丢失已完成的执行记录
  • 脚本全量执行完成后,自动删除校验文件,避免下次运行残留旧进度

参考实现逻辑:

import json
import os

CHECKPOINT_PATH = "xyz_progress.json"
TOTAL_TASK_NUM = 1000  # 替换为脚本实际的任务总量

# 启动时加载历史进度
current_start = 0
if os.path.exists(CHECKPOINT_PATH):
    with open(CHECKPOINT_PATH, "r", encoding="utf-8") as f:
        saved_state = json.load(f)
        current_start = saved_state.get("completed_index", -1) + 1

# 从记录的断点位置开始执行
for task_index in range(current_start, TOTAL_TASK_NUM):
    # 执行对应索引的任务逻辑
    run_single_task(task_index)
    # 完成单任务后立刻持久化最新进度
    with open(CHECKPOINT_PATH, "w", encoding="utf-8") as f:
        json.dump({"completed_index": task_index}, f)

# 全部任务完成后清理进度文件
os.remove(CHECKPOINT_PATH)

*注意:进度写入时可采用临时文件+原子重命名的方式,避免写文件过程中断导致进度文件损坏。

3. 无人工干预的配套增强

  • 监控脚本可配置为开机自启的后台服务运行,不需要人工守在终端前
  • 把每次脚本启动、退出的时间节点、退出原因、当前断点位置写入独立日志文件,后续排查运行状态时直接查阅日志即可
  • 可按需设置最大重试次数,避免脚本出现不可恢复的代码错误时无限循环空转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 21:45:04