ssd固态硬盘监控温度脚本python

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}秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值