Windows定时任务 每隔一段时间(最小到秒级)执行一次指定的Python脚本

脚本 service_check_admin.py

import requests
import subprocess
import sys
import os
import logging
from time import sleep

# 配置日志 - 记录到文件以便后台运行时查看
LOG_FILE = "service_monitor1.log"
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler(LOG_FILE),
        logging.StreamHandler(sys.stdout)  # 保留控制台输出(后台运行时不可见)
    ]
)
logger = logging.getLogger(__name__)

# 服务配置
SERVICE_URLS = [
    "http://127.0.0.1:8089/index.html"
    # "http://127.0.0.1:9999"
]
JAR_COMMAND = r"java -jar E:\qaml\datax\dataxweb\datax-admin-2.1.2.jar"  # 修改为你的JAR路径
# JAR_COMMAND = r"java -jar E:\qaml\datax\dataxweb\datax-executor-2.1.2.jar"
TIMEOUT = 10  # 请求超时时间(秒)
MAX_RETRIES = 2  # 检测失败时的重试次数
RETRY_DELAY = 5  # 重试间隔(秒)


def check_service(url):
    """检查单个服务的可用性"""
    try:
        response = requests.get(url, timeout=TIMEOUT)
        if response.status_code == 200:
            logger.info(f"服务正常: {url}")
            return True
        else:
            logger.warning(f"服务响应异常: {url} (状态码: {response.status_code})")
            return False
    except requests.exceptions.RequestException as e:
        logger.error(f"服务连接失败: {url} - {str(e)}")
        return False


def check_all_services():
    """检查所有服务的可用性(带重试机制)"""
    logger.info("开始服务健康检查...")

    for attempt in range(1, MAX_RETRIES + 1):
        all_ok = True
        for url in SERVICE_URLS:
            if not check_service(url):
                all_ok = False
                break  # 发现一个失败就停止检查其他URL

        if all_ok:
            logger.info(f"所有服务运行正常 (尝试 {attempt}/{MAX_RETRIES})")
            return True

        if attempt < MAX_RETRIES:
            logger.warning(f"检测失败,{RETRY_DELAY}秒后重试 ({attempt}/{MAX_RETRIES})")
            sleep(RETRY_DELAY)

    logger.error(f"所有 {MAX_RETRIES} 次尝试均失败")
    return False


def start_jar_service():
    """在Windows后台启动JAR服务(无窗口)"""
    logger.info("尝试启动JAR服务...")
    try:
        # 使用Windows特有的CREATE_NO_WINDOW标志
        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        startupinfo.wShowWindow = 0  # 0 = SW_HIDE (隐藏窗口)

        process = subprocess.Popen(
            JAR_COMMAND,
            stdout=open("jar_output1.log", "w"),
            stderr=open("jar_error1.log", "w"),
            startupinfo=startupinfo,
            creationflags=subprocess.CREATE_NO_WINDOW
        )

        logger.info(f"JAR服务已启动 (PID: {process.pid})")
        return True
    except Exception as e:
        logger.error(f"启动JAR服务失败: {str(e)}")
        return False


def main():
    """主函数:执行一次完整的健康检查和必要的重启"""
    if check_all_services():
        logger.info("服务状态正常,无需操作")
        sys.exit(0)  # 正常退出
    else:
        logger.warning("检测到服务异常,尝试重启...")
        if start_jar_service():
            logger.info("服务重启成功")
            sys.exit(1)  # 异常但已处理
        else:
            logger.error("服务重启失败")
            sys.exit(2)  # 异常且处理失败


if __name__ == "__main__":
    logger.info("====== 服务检测开始 ======")
    main()
    logger.info("====== 服务检测结束 ======")

 bat执行文件:start_check_admin.bat

@echo off
echo 进度 100% 已完成 >> status.log
start /B pythonw "D:\datax\dataxweb\service_check_admin.py"
exit

 

image

 

image

 

image

 

image

 

posted @ 2025-10-17 17:22  悠悠乃  阅读(29)  评论(0)    收藏  举报