我临时被迫使用一台风扇坏了的笔记本电脑。在轻负载下,它工作正常,但一旦我开始计算密集型工作,即使将 cpufreq 设置为最低,温度也会大幅升高。
我想自动化我现在手工做的一些事情,当温度升高到某个阈值以上时使用 Ctrl-Z 暂停昂贵的工作,当温度降到某个点以下时恢复它。
在我编写自己的命令或包装脚本之前,是否存在可以执行此操作的现有命令或包装脚本?
在包装器下运行单个作业就足够了,但如果它可以暂停一整类任务就更好了;不幸的是,我无法轻松地在某个用户下运行所有昂贵的作业,但我可以重新调整它们的优先级,并在过热时暂停所有已优化的作业。
答案1
我想您目前是使用sensors
其他命令行实用程序来检查 CPU 温度的?
在这种情况下,您可以编写一个小脚本,不断(例如,以 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)
killall 命令中的-9
并不是严格要求的,它只是用来发送 SIGKILL 而不是 SIGTERM。要发送其他信号(如 SIGUSR1),您可以尝试killall -SIGUSR1
。
希望能帮助到你。
答案2
你可以尝试/适应保持酷。