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





浙公网安备 33010602011771号