सीपीयू टेम्परेशन के आधार पर सिगस्टॉप / सिगॉन्ट प्रक्रिया कैसे करें?


1

मैं अस्थायी रूप से एक लैपटॉप पर काम करने के लिए मजबूर हूं जिसका प्रशंसक विफल हो गया है। हल्के भार के तहत यह ठीक काम करता है, लेकिन जैसे ही मैं कम्प्यूटेशनल रूप से गहन नौकरियों को शुरू करता हूं, तापमान बहुत महत्वपूर्ण रूप से बढ़ जाता है, तब भी जब cpufreq न्यूनतम पर आंकी जाती है।

मैं कुछ के लिए हाथ से कर रहा हूँ, जब तक तापमान थ्रेशोल्ड से ऊपर उठता है, और एक निश्चित बिंदु से नीचे तापमान गिर जाता है, तब इसे फिर से शुरू करें।

क्या कोई मौजूदा कमांड या रैपर स्क्रिप्ट है जो मुझे लिखने से पहले ऐसा करती है?

एक आवरण के नीचे एक ही काम चलाना पर्याप्त होगा, लेकिन यह अच्छा होगा यदि यह कार्यों के एक पूरे वर्ग को निलंबित कर सकता है; दुर्भाग्य से मैं आसानी से अपने सभी महंगी नौकरियों को किसी उपयोगकर्ता के तहत नहीं चला सकता, लेकिन मैं उनका नाम बदल सकता था, और जब ओवरहीट हो जाता है तो सभी शून्य नौकरियों को निलंबित कर सकता हूं।


संभव होना चाहिए, लेकिन मैंने ऐसा कुछ भी नहीं देखा है जो किसी भी मंच पर ऐसा करता हो
soandos

मैंने सेंसर का उपयोग करके एक छोटी सी बैश स्क्रिप्ट लिखी है: github.com/B2F/hotprocessensors
B2F

जवाबों:


2

मुझे लगता है कि आप वर्तमान sensorsमें कुछ अन्य कमांड लाइन उपयोगिता के साथ सीपीयू तापमान की जांच करते हैं ?

उस स्थिति में आप एक छोटी स्क्रिप्ट लिख सकते हैं जो लगातार (इस तरह, 2 सेकंड के अंतराल के साथ) इस आउटपुट की जांच करती है।

यह निम्न स्क्रिप्ट का उपयोग करके php में किया जा सकता है:

<?php

$threshold = 78;  //The value at which you will start killing processes
$processes = array(  //All the processes to be killed when threshold is reached
    'sampleprocess',
    'anotherveryintensiveprocess',
);

while (true)
{
    exec('sensors', $output);

    $temperature = 0;
    $div = 0;
    foreach ($output as $line)
    {
        preg_match('@\\+[0-9]+\\.[0-9]°C@', $line, $match);
        if (count($match) <> 1) continue;
        $temperature+= substr($match[0], 1, -2);
        $div++;
    }

    if ($div == 0)
        exit;

    $temperature/= $div;

    if ($temperature >= $threshold)
    foreach ($processes as $proc)
        passthru("killall -9 \"$proc\""); //You can also forget about the `-9`

    sleep(2);    //polling interval
}

?>

ध्यान दें कि यह स्क्रिप्ट आउटपुट फॉर्म sensorsको एक ऐसे रूप में प्रदर्शित करती है, जहां +<number>.<number>°Cतापमान का पहला अनुक्रम प्रदर्शित होता है। इस आउटपुट के लिए यह इस प्रकार अपेक्षित है:

coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +40.0°C  (high = +78.0°C, crit = +100.0°C)
Core 1:       +38.0°C  (high = +78.0°C, crit = +100.0°C)

-9Killall आदेश में सख्ती से की आवश्यकता नहीं है, यह सिर्फ वहाँ SIGTERM के बजाय, SIGKILL भेजने के लिए है। अन्य सिग्नल भेजने के लिए (जैसे SIGUSR1) आप कोशिश कर सकते हैं killall -SIGUSR1

आशा है ये मदद करेगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.