使用Python获取硬盘温度

我想使用Python(在Linux下)获得硬盘温度。 我目前使用hddtemp调用hddtemp ,但我经常调用它,这是我的脚本中的性能瓶颈。 我认为应该可以做类似问题4193514 ?

您可以运行hddtemp作为守护进程(-d选项),然后使用套接字查询它 – 默认为端口7634。

编辑:看到一些代码,这样做 。

扩展@gnibbler在他的主要评论中提出的建议是什么? 这是一个愚蠢简单的例子,只是为了展示这个概念:

 from collection import defaultdict class CachedValue(object): def __init__(self): self.timestamp = -1 self._value = None @property def value(self): return self._value @value.setter def value(self, val): self._value = val self.timestamp = time.time() def isOld(self, seconds): return (time.time() - self.timestamp) >= seconds >>> _cached = defaultdict(CachedValue) >>> _cached['hddtemp'].isOld(10) True >>> _cached['hddtemp'].value = 'Foo' >>> _cached['hddtemp'].isOld(10) False # (wait 10 seconds) >>> _cached['hddtemp'].isOld(10) True 

而在你的具体情况下:

 def reportHDD(self): if self._cached['hddtemp'].isOld(10): self._cached['hddtemp'].value = self.getNewHDDValue() return self._cached['hddtemp'].value 

这种方法实际上是缓存昂贵操作的一个通用解决方案。 在较大的应用程序中,CachedValue可以很容易地用一个简单的memcached / redis查找替换,这个查找会为您保留自己的TTL值。 但从小规模来看,这只是组织当地缓存价值的一种奇特的方式。

我搜索了一段时间,无论我如何格式化我的搜索,这个命中不断出现接近顶部。 我有smartmontools和至少python 2.7.6安装在我的所有主机上,我不想安装一个新的软件包管道硬盘临时数据石墨/ statsd,所以我做了以下。

我不是一个开发人员,我不知道蟒蛇(这是显而易见的),所以这是我的1-2天的尝试找出来的。 我很尴尬的发布所有的代码在这里,但这里是主要的dealy ::

 enter code here #!/usr/bin/env python import os import subprocess import multiprocessing def grab_hdd_temp(hdd, queue): for line in subprocess.Popen(['smartctl', '-a', str('/dev/' + hdd)], stdout=subprocess.PIPE).stdout.read().split('\n'): if ( 'Temperature_Celsius' in line.split() ) or ('Temperature_Internal' in line.split() ): queue.put([hdd, line.split()[9]]) def hddtmp_dict(hdds_list): procs = [] queue = multiprocessing.Queue() hddict={} for hdd in hdds_list: p = multiprocessing.Process(target=grab_hdd_temp, args=(hdd, queue)) procs.append(p) p.start() for _ in procs: val = queue.get() hddict[val[0]]=val[1] p.join() return hddict if __name__ == '__main__': hdds_list = [ x for x in os.listdir('/sys/block/') if x.startswith('sd') ] hddict = hddtmp_dict(hdds_list) for k in hddict: print(k, hddict[k]) 

在我的存储服务器上,它在2秒内返回了38个驱动器的完整列表,而对于所有磁盘串行重复50秒。 也就是说,在40芯盒子上,负载从1.08上升到3.50。 所以,如你所愿。 我试图找到一种方法来使用proc或可能fcntl 基于另一个堆栈溢出我发现拉数据,而不是使用subprocess.popen但呃。

现在是凌晨2点22分,我需要开始回家。 一旦那里,我会尝试和概述上面的片段,并说我觉得一切都在做什么,但我希望这是有点不言自明。

对不起kludge代码。 我认为缓冲是更好的方法,但这是一个很酷的练习。 如果你不想安装hddtemp,而且我认为上面的缓冲区可能是最好的选择。 仍然试图弄清楚,以及我不明白如何做类。

我希望这可以帮助别人。