Como controlar os processos sigstop / sigcont com base na temperatura da CPU?

1

Estou temporariamente obrigado a trabalhar em um laptop cujo ventilador falhou. Sob cargas leves, funciona bem, mas assim que inicio trabalhos intensivos em computação, a temperatura aumenta de forma muito significativa, mesmo quando o cpufreq está atrelado ao mínimo.

Gostaria de automatizar algo que estou fazendo à mão por enquanto, suspendendo o trabalho caro com Ctrl-Z quando a temperatura sobe acima de um limite, e retome quando a temperatura cai abaixo de um certo ponto.

Existe um comando ou wrapper script que faz isso antes de eu escrever o meu?

A execução de um único trabalho em um wrapper seria suficiente, mas seria melhor se ele pudesse suspender toda uma classe de tarefas; infelizmente, não consigo executar facilmente todos os meus trabalhos caros em algum usuário, mas posso renegá-los e suspender todos os trabalhos afetados quando ele superaquece.

    
por b0fh 03.08.2012 / 00:54

2 respostas

2

Suponho que você atualmente verifique a temperatura da CPU com sensors de algum outro utilitário de linha de comando?

Nesse caso, você pode escrever um script pequeno que, constantemente (com um intervalo de, digamos, 2 segundos), verifica essa saída.

Isso pode ser feito em php usando o seguinte script:

<?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
}

?>

Observe que esse script espera o formulário de saída sensors em um formulário em que a primeira sequência de +<number>.<number>°C representa a temperatura. Para essa saída, isso funciona como esperado:

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)

O -9 no comando killall não é estritamente necessário, ele está lá apenas para enviar SIGKILL, em vez de SIGTERM. Para enviar outros sinais (como SIGUSR1) você pode tentar killall -SIGUSR1 .

Espero que ajude.

    
por 08.08.2012 / 19:12
1

Você pode tentar / adaptar Mantenha a calma .

    
por 24.11.2012 / 03:08