1.
pip3 install --user psutil #只针对当前用户 没有入侵式相关的脚本
2.具体的代码
#!/usr/bin/env python3
import os
import time
import glob
import subprocess
from datetime import datetime
def check_dependencies():
"""检查必需的系统工具"""
required = {
'smartctl': {
'test': ['smartctl', '--version'],
'install': 'sudo apt install smartmontools'
}
}
missing = []
for tool, info in required.items():
try:
subprocess.run(info['test'],
check=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
except:
missing.append(f"{info['install']} # 安装{tool}")
if missing:
print("需要先安装以下工具:")
print("\n".join(missing))
exit(1)
def get_ssd_list():
"""获取所有SSD设备列表"""
ssds = []
for dev in glob.glob('/sys/block/sd*') + glob.glob('/sys/block/nvme*'):
device = os.path.basename(dev)
model = read_sys_file(f"{dev}/device/model") or "Unknown"
size = int(read_sys_file(f"{dev}/size") or 0) * 512 // (1024**3) # 转换为GB
ssds.append({
'device': device,
'model': model.strip(),
'size': size
})
return ssds
def read_sys_file(path):
"""安全读取sysfs文件"""
try:
with open(path, 'r') as f:
return f.read().strip()
except:
return None
def get_disk_temp(device):
"""多方法获取磁盘温度"""
# 方法1: 直接读取hwmon接口
hwmon_paths = glob.glob(f"/sys/block/{device}/device/hwmon/hwmon*/temp*_input")
for path in hwmon_paths:
try:
temp = int(read_sys_file(path)) / 1000
return f"{temp:.1f}℃ (hwmon)"
except:
continue
# 方法2: 使用smartctl
try:
output = subprocess.check_output(
['sudo', 'smartctl', '-A', f'/dev/{device}'],
stderr=subprocess.DEVNULL
).decode()
# 匹配多种温度格式
for line in output.split('\n'):
if 'Temperature' in line:
parts = [p for p in line.split() if p.replace('.','').isdigit()]
if parts:
return f"{parts[-1]}℃ (SMART)"
except:
pass
return "N/A"
def get_disk_health(device):
"""获取磁盘健康状态"""
try:
output = subprocess.check_output(
['sudo', 'smartctl', '-H', f'/dev/{device}'],
stderr=subprocess.DEVNULL
).decode()
return "PASSED" if "PASSED" in output else "FAILED"
except:
return "N/A"
def monitor(interval=10):
"""主监控循环"""
check_dependencies()
try:
while True:
os.system('clear')
print(f"\n🔍 SSD温度监控 (更新: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')})")
print("="*70)
print(f"{'设备':<8}{'型号':<25}{'温度':<15}{'健康':<10}{'容量':<10}")
print("-"*70)
for disk in get_ssd_list():
print(
f"{disk['device']:<8}"
f"{disk['model'][:24]:<25}"
f"{get_disk_temp(disk['device']):<15}"
f"{get_disk_health(disk['device']):<10}"
f"{disk['size']}GB"
)
print("\n提示: 按Ctrl+C退出 | 检测间隔: {interval}秒")
time.sleep(interval)
except KeyboardInterrupt:
print("\n🛑 监控已停止")
if __name__ == "__main__":
# 配置sudo免密码(可选)
if not os.path.exists("/etc/sudoers.d/ssd_monitor"):
try:
with open("/etc/sudoers.d/ssd_monitor", "w") as f:
f.write(f"{os.getlogin()} ALL=(ALL) NOPASSWD: /usr/sbin/smartctl\n")
print("✅ 已配置sudo免密码")
except:
print("⚠️ 需要手动配置sudo权限:\n"
f"echo '{os.getlogin()} ALL=(ALL) NOPASSWD: /usr/sbin/smartctl' | "
"sudo tee /etc/sudoers.d/ssd_monitor")
monitor()
3.结果信息
🔍 SSD温度监控 (更新: 2025-08-04 12:15:55)
======================================================================
设备 型号 温度 健康 容量
----------------------------------------------------------------------
sdb Samsung SSD xxx 37℃ (SMART) PASSED 465GB
sda HixxxxSD12 35℃ (SMART) PASSED 111GB
提示: 按Ctrl+C退出 | 检测间隔: {interval}秒