如何实现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
相关产品推荐
相关产品推荐

