Как sigstop/sigcont процессы, основанные на температуре процессора?
Я временно вынужден работать на ноутбуке, вентилятор которого вышел из строя. При небольшой нагрузке он работает нормально, но как только я начинаю вычислительно интенсивную работу, температура очень значительно возрастает, даже когда cpufreq привязан к минимуму.
Я бы хотел автоматизировать то, что я сейчас делаю вручную, приостановив дорогую работу с помощью Ctrl-Z, когда температура поднимется выше некоторого порога, и возобновить это, когда температура упадет ниже определенной точки.
Есть ли существующая команда или скрипт-обертка, которая делает это, прежде чем я напишу свой собственный?
Было бы достаточно запустить одно задание в оболочке, но было бы лучше, если бы оно могло приостановить целый класс задач; К сожалению, я не могу легко запустить все мои дорогие работы под каким-то пользователем, но я мог бы взять их в аренду и приостановить все плохие работы, когда он перегрелся.
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
,
Надеюсь, поможет.