带无限循环的Python定时脚本被Windows任务计划打断如何解决?
针对该问题的可行解决建议
第一步:先定位脚本终止原因
- 给脚本增加运行日志和全局异常捕获,确认脚本是自身报错退出还是被系统/其他任务强制终止。可以对比日志记录的退出时间和另一个定时任务的触发时间,匹配度高则说明两个任务存在资源或配置冲突。
- 查看Windows事件查看器:进入「Windows日志-应用程序」,筛选对应时间点的日志项,确认是否存在Python进程崩溃、系统资源不足触发的进程回收记录。
- 检查两个定时任务的配置:
- 如果你的selenium脚本也是通过Windows任务计划启动,确认是否勾选了「超时自动停止任务」「电量切换时停止任务」这类默认开启的限制项,同时确认脚本的运行优先级是否低于另一个任务。
- 检查另一个定时任务的逻辑,确认是否存在查杀Python进程、chromedriver进程、Chrome进程的相关操作。
第二步:针对性优化修复
代码层面优化
- 增加全局异常捕获和资源自动清理逻辑,避免资源波动、浏览器偶发崩溃带崩整个调度循环,参考修改后的代码:
import schedule import time import logging import traceback import os # 配置持久化日志 logging.basicConfig( level=logging.INFO, filename='selenium_scheduler.log', format='%(asctime)s - %(levelname)s - %(message)s' ) def get_info(): try: logging.info("启动抓取任务") # 原有抓取逻辑保留在这里 except Exception as e: logging.error(f"抓取任务出错: {str(e)}\n{traceback.format_exc()}") # 自动清理残留的浏览器进程,避免资源泄漏 os.system("taskkill /f /im chromedriver.exe /t >nul 2>&1") os.system("taskkill /f /im chrome.exe /t >nul 2>&1") schedule.every(2).minutes.until("18:30").do(get_info) if __name__ == "__main__": logging.info("调度脚本启动") # 自动提升当前进程优先级 os.system(f"wmic process where processid={os.getpid()} CALL setpriority 128 >nul 2>&1") while True: try: schedule.run_pending() time.sleep(1) except KeyboardInterrupt: logging.info("手动终止脚本") break except Exception as e: logging.error(f"调度循环出错: {str(e)}\n{traceback.format_exc()}") time.sleep(3)
- 给Chrome启动配置增加独立用户目录,避免和其他Chrome实例冲突,Selenium启动参数参考:
from selenium import webdriver options = webdriver.ChromeOptions() # 配置独立的用户数据目录,提前手动创建对应文件夹即可 options.add_argument(r"--user-data-dir=C:\selenium_chrome_profile") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(options=options)
系统层面优化
- 优先用管理员权限运行脚本,避免权限不足被其他任务抢占资源。
- 改用NSSM工具将脚本注册为Windows系统服务,系统服务的运行优先级高于普通任务计划触发的进程,不会被普通任务随便终止,同时支持系统重启后自动拉起。
- 调整另一个定时任务的执行时间,尽量和你的2分钟抓取任务错开,避免同时运行抢占CPU、内存资源。
兜底方案
如果始终无法定位终止原因,可以额外写一个轻量监控脚本,每分钟检查一次你的调度脚本进程是否存在,不存在则自动重启,监控脚本可通过Windows任务计划设置为每分钟执行一次。
内容的提问来源于stack exchange,提问作者arak
相关产品推荐
相关产品推荐

