pdf_code/monitor_milvus.py

126 lines
4.3 KiB
Python
Raw Permalink Normal View History

2025-09-02 15:23:55 +08:00
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()