2012-05-02 11 views
5

(Linuxの場合)Pythonを使用してハードディスクの温度を取得したいと考えています。私は現在hddtempsubprocess.popenと呼んでいますが、私はそれをスクリプトの中でパフォーマンスのボトルネックと呼んでいます。 question 4193514と似たようなことができるはずですか?Pythonを使用してハードディスクの温度を取得

+3

どのくらいの頻度で温度をチェックしていますか?あなたは1分程度の値をキャッシュすることができるはずです。それは非常に迅速に変化しません。 –

+4

@gnibbler:しかし、彼は暖炉にマシンを投げ込む状況をどうやって測定することができますか? – jdi

+0

リアルタイムサーバーのステータスを表示するWebページ用です。ページが開いているときは、約5-10秒ごとにリフレッシュされます。 – lyineyes

答えて

5

あなたはそれを照会するソケットを使用して、デーモン(-dオプション)としてhddtemp実行することができます - ポートデフォルトは7634.

編集:some code that does thisを参照してください。

+0

これはまさに私が探していたものです。ありがとう!コード例のボーナスポイント。 – lyineyes

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 

このアプローチは、高価な操作をキャッシュするための一般的なソリューションの本当に多くのですこれは単なる概念を示すために、愚かな簡単な例です。大規模なアプリケーションでは、CachedValueは簡単なmemcached/redisルックアップで簡単に置き換えることができ、独自のTTL値を保持します。しかし、小規模では、ローカルのキャッシュされた値を整理するための素晴らしい方法です。

+0

素晴らしい例。私はこれを他の機能に使用すると思いますが、ハードドライブの温度を得るために、dictエントリを更新するためにスレッドを生成することにしました(遅いシステムコールのオーバーヘッドを緩和しようとする)。 – lyineyes

+0

@lyineyes:でも、一時的に妥当な時間枠内でしか変動しないのであれば、それはスレッドやそれ以外の場所でオーバーヘッドが発生するのでしょうか?しかし、Hugh Bothwell氏は、このツールのデーモン版を具体的に監視できることを彼の答えで述べています。おそらくそれはあなたの非常に具体的な修正です。しかし、私はあなたが一般的なキャッシングソリューションのこのアプローチを気に入ってうれしいです! – jdi

2

私はしばらくの間、私の検索をどのようにフォーマットしても、トップの近くでこのヒットを続けていました。私はsmartmontoolsを持っていて、少なくともPython 2.7.6を私のホストのすべてにインストールしていました。そして、hdd temp dataをpipe/graphs/statsdにパイプする新しいパッケージをインストールしたくないので、以下のようにしました。

私は開発者ではありません。私はpythonを分かりません(これは明らかです)。これは、これを理解するための1-2日の試みです。 Iこれはすべてを反復処理するために2秒対50秒で38台のドライブの完全なリストを返され、ここですべてのコードを投稿するにはあまりにも恥ずかしい思いますが、ここでの主な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]) 

マイストレージサーバ上でディスクをシリアルに接続します。それは、40コアボックスで約1.08から3.50に上がっていると言いました。だからそれをあなたの意志で取る。私は、procを使用する方法、あるいはfcntl based on another stack overflow I foundを使用して、subprocess.popenではなくehを使用してデータを取得する方法を見つけようとしています。

ここは2時22分です。私は家に向かう必要があります。一度そこに私は上記のスニペットを概説しようとし、すべてが何をしていると思っていると言うだろうが、それはやや自明だと思う。

申し訳ありませんが、kludgeコードです。私はこの時点でバッファーがより良い方法だと思っていますが、それは素晴らしい演習でした。 hddtempをインストールしたくない場合は、上記のバッファ+が最適なオプションかもしれないと思います。まだそれを理解しようとしているだけでなく、私は授業の仕方を理解していません。

私はこれが誰かを助けてくれることを願っています。

+0

悲しいことに私は現在、ServerFaultから一年停止しています。なぜなら、シフトキーを使用する初心者には、 – peterh

関連する問題