import schedule import threading import queue from lib.base import * import time import logging # 配置日志记录器,仅输出到控制台 logging.basicConfig( level=logging.DEBUG, # 设置日志级别为 DEBUG format='%(asctime)s - %(levelname)s - %(message)s', # 日志格式:时间 - 日志级别 - 消息 handlers=[ logging.StreamHandler() # 将日志输出到控制台 ] ) """ 执行指令: 1.打开一个终端输入: - cd .\运维集控\项目测试\运维标准版\ - python -m http.server 80 --directory log 2.打开新终端输入: - cd .\运维集控\项目测试\运维标准版\ngrok\ - .\start.bat 2.再打开一个终端输入: - cd .\运维集控\项目测试\运维标准版\ - python .\定时任务执行.py """ # 创建一个任务队列,用于存储待处理的任务 task_queue = queue.Queue() def run_task(task, *args, **kwargs): # 将任务及其参数放入任务队列 task_queue.put((task, args, kwargs)) logging.debug(f"任务已加入队列: {task.__name__} with args: {args} and kwargs: {kwargs}") def worker(): # 工作线程的主循环 while True: # 从任务队列中获取任务及其参数 task, args, kwargs = task_queue.get() try: # 记录任务开始执行的时间 logging.debug(f"开始执行任务: {task.__name__} with args: {args} and kwargs: {kwargs}") # 执行任务并获取结果 result = task(*args, **kwargs) # 如果任务有返回结果,记录日志 if result: logging.info(result) except Exception as e: # 捕获任务执行过程中发生的任何异常并记录错误日志 logging.error(f"执行任务时发生错误: {e}", exc_info=True) finally: # 无论任务是否成功执行,都标记任务已完成 task_queue.task_done() # 记录任务完成的时间 logging.debug(f"任务完成: {task.__name__}") def start_workers(num_workers): # 启动指定数量的工作线程 for _ in range(num_workers): # 创建一个新的工作线程,目标函数为 worker,设置为守护线程 threading.Thread(target=worker, daemon=True).start() # 启动3个工作线程 start_workers(3) # 定义每天定时执行的任务 # 每天早上07:50执行后台系统设置功能测试 schedule.every().day.at("07:50").do(run_task, run_automation_test, report_title="运维系统测试报告", report_url_prefix="http://nat.ubainsyun.com:31135", ding_type="标准版巡检") # 调试使用 #schedule.every().day.at("09:59").do(run_task, run_automation_test, report_title="运维系统脚本调试", report_url_prefix="http://nat.ubainsyun.com:31135", ding_type="标准版巡检") try: # 无限循环,持续检查并执行计划任务 while True: schedule.run_pending() # 检查并执行所有待处理的任务 time.sleep(1) # 每秒检查一次 except KeyboardInterrupt: # 捕获用户中断信号 (Ctrl+C) logging.info("Scheduler interrupted by user.") except Exception as e: # 捕获其他未预期的异常 logging.error(f"Unexpected error: {e}", exc_info=True)