2012-05-02 13 views
5

का उपयोग कर हार्ड डिस्क तापमान प्राप्त करें मैं पाइथन (लिनक्स के तहत) का उपयोग कर हार्ड डिस्क का तापमान प्राप्त करना चाहता हूं। मैं वर्तमान में hddtemp पर subprocess.popen के साथ फोन कर रहा हूं, लेकिन मैं इसे अक्सर इतना कहता हूं कि यह मेरी लिपि में एक प्रदर्शन बाधा है। मुझे लगता है कि question 4193514 के समान कुछ करना संभव होना चाहिए?पाइथन

+3

आप कितनी बार तापमान की जांच कर रहे हैं? आपको एक मिनट या उससे भी अधिक समय तक कैश करने में सक्षम होना चाहिए। यह बहुत जल्दी नहीं बदलता है। –

+4

@gnibbler: लेकिन वह मशीन को फायरप्लेस में फेंकने की परिस्थिति को मापने में कैसे सक्षम होगा? – jdi

+0

यह एक वेब पेज के लिए रीयलटाइम सर्वर स्थिति दिखा रहा है। जब पृष्ठ खुला होता है, तो यह हर 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 

यह दृष्टिकोण एक सामान्य समाधान एक महंगी आपरेशन कैशिंग के वास्तव में अधिक है यह सिर्फ अवधारणा दिखाने के लिए एक stupidly सरल उदाहरण है। बड़े अनुप्रयोगों में, कैश्डवैलू को आसानी से एक साधारण मेमकैच/रेडिस लुकअप के साथ प्रतिस्थापित किया जा सकता है जो आपके लिए अपने टीटीएल मूल्य को बनाए रखता है। लेकिन एक छोटे पैमाने पर, यह स्थानीय कैश किए गए मूल्यों का आयोजन करने का एक शानदार तरीका है।

+0

महान उदाहरण। मुझे लगता है कि मैं इसे अन्य कार्यों के लिए उपयोग करूंगा, लेकिन हार्डड्राइव तापमान प्राप्त करने के लिए, मैंने एक थ्रेड एंट्री अपडेट करने के लिए थ्रेड (धीमी सिस्टम कॉल के ओवरहेड को कम करने और कम करने के लिए) का उपयोग किया है। – lyineyes

+0

@lyineyes: लेकिन क्यों ओवरहेड को थ्रेड या कहीं भी हो सकता है, अगर अस्थायी वास्तव में केवल उचित समय सीमा के भीतर उतार-चढ़ाव कर सकता है? लेकिन ह्यूग बॉवेलवेल ने अपने जवाब में उल्लेख किया है कि आप विशेष रूप से इस टूल के डिमनीकृत संस्करण की निगरानी कर सकते हैं। तो शायद यह आपके बहुत ही विशिष्ट फिक्स है। लेकिन मुझे खुशी है कि आपको सामान्य कैशिंग समाधान के लिए यह दृष्टिकोण पसंद आया! – jdi

2

मैं थोड़ी देर के लिए चारों ओर घूम रहा था और यह हिट शीर्ष के करीब आ रही थी इससे कोई फर्क नहीं पड़ता कि मैंने अपनी खोज को कैसे स्वरूपित किया। मेरे पास smartmontools और कम से कम पायथन 2.7.6 मेरे सभी होस्ट्स पर स्थापित हैं और मैं ग्रेफाइट/आँकड़े में पाइप एचडीडी डेटा डेटा को नया पैकेज स्थापित नहीं करना चाहता था इसलिए मैंने निम्नलिखित किया।

मैं डेवलपर नहीं हूं और मुझे पाइथन (स्पष्ट के रूप में) नहीं पता है, इसलिए यह पता लगाने में मेरा 1-2 दिन का प्रयास है। मैं भी कोड यहाँ के सभी पोस्ट करने के लिए शर्मिंदा हूँ, लेकिन यहाँ मुख्य विलंब ::

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 तक बढ़ता है। तो इसे ले लो जैसा आप करेंगे। मैं subprocess.popen का उपयोग करने के बजाय डेटा खींचने के लिए proc या संभवतः fcntl based on another stack overflow I found का उपयोग करने का कोई तरीका खोजने का प्रयास कर रहा हूं लेकिन एह।

यह 2:22 बजे है और मुझे घर जाने शुरू करने की आवश्यकता है। एक बार वहां मैं ऊपर स्निपेट को आज़माकर रेखांकित करूँगा और कहूंगा कि मुझे लगता है कि सबकुछ क्या कर रहा है, लेकिन मुझे उम्मीद है कि यह कुछ हद तक आत्म-व्याख्यात्मक है।

क्लज कोड के लिए खेद है। मुझे लगता है कि बफर इस बिंदु पर जाने का बेहतर तरीका है लेकिन यह एक अच्छा अभ्यास था। यदि आप hddtemp को स्थापित नहीं करना चाहते हैं और यह मुझे लगता है कि उपरोक्त बफर + सबसे अच्छा विकल्प हो सकता है। अभी भी इसे समझने की कोशिश कर रहे हैं साथ ही मुझे समझ में नहीं आता कि कक्षाएं कैसे करें।

मुझे आशा है कि इससे किसी की मदद मिलेगी।

+0

अफसोस की बात है कि मुझे वर्तमान में एक वर्ष के लिए सर्वरफॉल्ट से निलंबित कर दिया गया है, क्योंकि मैंने नए शब्दों को शिफ्ट कुंजी का उपयोग करने की सलाह दी है यदि वे वाक्य शुरू करते हैं :-) – peterh