1fd0003fc8
Co-authored-by: Cursor <cursoragent@cursor.com>
99 lines
2.8 KiB
Python
99 lines
2.8 KiB
Python
"""中控:本机 CPU / 内存 / 磁盘 / 网络快照(监控区服务器状态条)。"""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import socket
|
|
import time
|
|
from typing import Any
|
|
|
|
_state: dict[str, Any] = {
|
|
"primed": False,
|
|
"net_ts": 0.0,
|
|
"net_sent": 0,
|
|
"net_recv": 0,
|
|
}
|
|
|
|
|
|
def _disk_path() -> str:
|
|
raw = (os.getenv("HUB_HOST_DISK_PATH") or "").strip()
|
|
if raw:
|
|
return raw
|
|
if os.name == "nt":
|
|
drive = (os.environ.get("SystemDrive") or "C:").strip()
|
|
return drive if drive.endswith(("\\", "/")) else drive + "\\"
|
|
return "/"
|
|
|
|
|
|
def _safe_int(value: Any) -> int:
|
|
try:
|
|
return int(value)
|
|
except (TypeError, ValueError):
|
|
return 0
|
|
|
|
|
|
def get_host_status() -> dict[str, Any]:
|
|
try:
|
|
import psutil
|
|
except ImportError:
|
|
return {
|
|
"ok": False,
|
|
"msg": "未安装 psutil,请在 manual-trading-hub 环境执行 pip install psutil",
|
|
}
|
|
|
|
now = time.time()
|
|
if not _state["primed"]:
|
|
psutil.cpu_percent(interval=None)
|
|
_state["primed"] = True
|
|
|
|
cpu_pct = float(psutil.cpu_percent(interval=None))
|
|
cpu_count = int(psutil.cpu_count(logical=True) or 0)
|
|
|
|
vm = psutil.virtual_memory()
|
|
disk_path = _disk_path()
|
|
du = psutil.disk_usage(disk_path)
|
|
|
|
net = psutil.net_io_counters()
|
|
sent_rate = 0.0
|
|
recv_rate = 0.0
|
|
if net is not None and _state["net_ts"] > 0:
|
|
dt = max(0.001, now - float(_state["net_ts"]))
|
|
sent_rate = max(0.0, (net.bytes_sent - int(_state["net_sent"])) / dt)
|
|
recv_rate = max(0.0, (net.bytes_recv - int(_state["net_recv"])) / dt)
|
|
if net is not None:
|
|
_state["net_ts"] = now
|
|
_state["net_sent"] = int(net.bytes_sent)
|
|
_state["net_recv"] = int(net.bytes_recv)
|
|
|
|
disk_total = _safe_int(du.total)
|
|
disk_used = _safe_int(du.used)
|
|
disk_pct = round(disk_used / disk_total * 100, 1) if disk_total > 0 else 0.0
|
|
|
|
boot = float(psutil.boot_time())
|
|
return {
|
|
"ok": True,
|
|
"hostname": socket.gethostname(),
|
|
"uptime_sec": max(0, int(now - boot)),
|
|
"cpu": {
|
|
"percent": round(cpu_pct, 1),
|
|
"count": cpu_count,
|
|
},
|
|
"memory": {
|
|
"total_bytes": _safe_int(vm.total),
|
|
"used_bytes": _safe_int(vm.used),
|
|
"percent": round(float(vm.percent), 1),
|
|
},
|
|
"disk": {
|
|
"path": disk_path,
|
|
"total_bytes": disk_total,
|
|
"used_bytes": disk_used,
|
|
"percent": disk_pct,
|
|
},
|
|
"network": {
|
|
"bytes_sent": _safe_int(net.bytes_sent if net else 0),
|
|
"bytes_recv": _safe_int(net.bytes_recv if net else 0),
|
|
"sent_rate_bps": round(sent_rate, 1),
|
|
"recv_rate_bps": round(recv_rate, 1),
|
|
},
|
|
"updated_at": time.strftime("%Y-%m-%d %H:%M:%S"),
|
|
}
|