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號