如何根据 CPU 温度对 sigstop/sigcont 进程进行控制?

如何根据 CPU 温度对 sigstop/sigcont 进程进行控制?

我临时被迫使用一台风扇坏了的笔记本电脑。在轻负载下,它工作正常,但一旦我开始计算密集型工作,即使将 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

你可以尝试/适应保持酷

相关内容