1

Я временно вынужден работать на ноутбуке, вентилятор которого вышел из строя. При небольшой нагрузке он работает нормально, но как только я начинаю выполнять вычислительные работы, температура очень значительно возрастает, даже когда cpufreq привязан к минимуму.

Я бы хотел автоматизировать то, что я сейчас делаю вручную, приостановив дорогую работу с помощью Ctrl-Z, когда температура поднимется выше некоторого порога, и возобновить это, когда температура упадет ниже определенной точки.

Есть ли существующая команда или скрипт-обертка, которая делает это, прежде чем написать свою собственную?

Было бы достаточно запустить одно задание в оболочке, но было бы лучше, если бы оно могло приостановить целый класс задач; к сожалению, я не могу легко запустить все свои дорогие работы под каким-то пользователем, но я мог бы взять их в аренду и приостановить все плохие работы, когда он перегрелся.

2 ответа2

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)

-9 в команде killall строго не требуется, она просто отправляет SIGKILL вместо SIGTERM. Для отправки других сигналов (например, SIGUSR1) вы можете попробовать killall -SIGUSR1 .

Надеюсь, поможет.

1

Вы можете попробовать / адаптировать Хранить в прохладе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .