pdf_code/monitor_milvus.py

126 lines
4.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import socket
import subprocess
import time
from datetime import datetime
import os
import mysql.connector
from zzb_data_prod.config import MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB
def get_time():
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def check_port(host, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
result = sock.connect_ex((host, port))
sock.close()
return result == 0 # 返回布尔值,表示端口是否可用
except Exception as e:
print(f"[{get_time()}] 端口检测异常: {str(e)}")
return False
def restart_service():
try:
subprocess.run(["bash", "/root/docker/milvus/standalone_embed.sh", "restart"])
print(f"[{get_time()}] milvus服务重启成功")
return True
except subprocess.CalledProcessError as e:
print(f"[{get_time()}] 服务重启失败: {str(e)}")
return False
def start_application_process():
"""启动8000端口对应的应用进程"""
try:
# 先尝试停止可能存在的旧进程
time.sleep(2) # 给进程停止的时间
# 进入应用目录
# 启动新进程
subprocess.run(
["bash", "/root/pdf_parser/restart_app.sh"],
)
print(f"[{get_time()}] 应用进程(8000端口)已成功启动")
return True
except Exception as e:
print(f"[{get_time()}] 启动应用进程失败: {str(e)}")
return False
def get_local_ip():
try:
# 创建一个 UDP 套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 连接到一个外部地址(这里使用 Google 的公共 DNS 服务器)
s.connect(("8.8.8.8", 80))
# 获取本地套接字的 IP 地址
local_ip = s.getsockname()[0]
except Exception as e:
print(f"[{get_time()}] 获取内网 IP 失败: {e}")
local_ip = "127.0.0.1" # 如果失败,返回本地回环地址
finally:
s.close() # 关闭套接字
return local_ip
def monitor_port_8000():
"""监控8000端口如果异常则启动应用进程"""
print(f"[{get_time()}] 检查8000端口状态...")
port_available = check_port("127.0.0.1", 8000)
if not port_available:
print(f"[{get_time()}] 检测到8000端口异常尝试启动应用进程...")
success = start_application_process()
if success:
# 启动后检查是否成功
time.sleep(10) # 等待应用启动
if check_port("127.0.0.1", 8000):
print(f"[{get_time()}] 应用进程启动成功8000端口已正常")
# INSERT_YOUR_CODE
# 检查并修改数据库字段
try:
conn = mysql.connector.connect(
host=MYSQL_HOST,
user=MYSQL_USER,
password=MYSQL_PASSWORD,
database=MYSQL_DB
)
cursor = conn.cursor()
local_ip = get_local_ip()
sql = f"update model_ip set status = 0 where ip = '{local_ip}:8000';"
print(f"[{get_time()}] 执行sql: {sql}")
cursor.execute(sql)
conn.commit()
print(f"[{get_time()}] 数据库字段已成功修改")
except Exception as e:
print(f"[{get_time()}] 修改数据库字段失败: {str(e)}")
finally:
try:
cursor.close()
conn.close()
except:
pass
else:
print(f"[{get_time()}] 应用进程启动后8000端口仍未正常")
else:
print(f"[{get_time()}] 8000端口状态正常")
if __name__ == '__main__':
print(f"[{get_time()}] 启动Milvus监控服务")
port_ok = check_port("127.0.0.1", 19530)
if not port_ok:
print("检测到Milvus服务异常尝试重启...")
restart_service()
print(f"[{get_time()}] 启动 8000 端口监控服务")
# 开始监控8000端口每60秒检查一次
monitor_port_8000()