使用Python获取硬盘温度

时间:2012-05-02 21:04:30

标签: python linux hard-drive temperature

我想使用Python(在Linux下)获取硬盘的温度。我目前正在使用hddtemp调用subprocess.popen,但我经常这样称它是我脚本中的性能瓶颈。我认为应该可以做类似于question 4193514的事情吗?

3 个答案:

答案 0 :(得分:5)

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

修改:请参阅some code that does this

答案 1 :(得分:2)

扩展@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

这种方法实际上更像是缓存昂贵操作的一般解决方案。在较大的应用程序中,可以使用简单的memcached / redis查找轻松替换CachedValue,该查找为您维护自己的TTL值。但从小规模来看,这只是组织本地缓存值的一种奇特方式。

答案 2 :(得分:2)

我正在谷歌上搜索一段时间,无论我如何格式化我的搜索,这个命中都会接近顶部。我有smartmontools,至少在我的所有主机上都安装了python 2.7.6,我不想安装新的软件包来将hdd临时数据传输到graphite / statsd,所以我做了以下内容。

我不是开发人员而且我不知道python(很明显)所以这是我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 based on another stack overflow I found来提取数据而不是使用subprocess.popen但是呃。

现在是凌晨2点22分,我需要开始回家。在那里,我将尝试概述上面的片段并说出我认为一切正在做什么,但我希望它有点不言自明。

对不起kludge代码。我认为缓冲区是目前更好的方法,但这是一个很酷的练习。如果您不想安装hddtemp,我认为缓冲区+以上可能是最佳选择。仍然试图解决这个问题以及我还不了解如何上课。

我希望这有助于某人。