126 lines
4.3 KiB
Python
126 lines
4.3 KiB
Python
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()
|
||
|
||
|