我想使用Python(在Linux下)获取硬盘的温度。我目前正在使用hddtemp
调用subprocess.popen
,但我经常这样称它是我脚本中的性能瓶颈。我认为应该可以做类似于question 4193514的事情吗?
答案 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,我认为缓冲区+以上可能是最佳选择。仍然试图解决这个问题以及我还不了解如何上课。
我希望这有助于某人。