Script Bash para dormir em determinada temperatura da CPU ~ atualização para 16.04

5

Esta é uma versão radicalmente atualizada da questão. Eu tenho que atualizar isso porque esta questão é marcada como duplicata deste, enquanto isso não tem mais uma resposta válida.

  • Versão inicial desta pergunta, que tinha a tag 11.04:

Eu sou novo em scripts e linux, meu comp é muito quente às vezes e eu quero fazer um script para detectar temp1 e se é mais de 65 C, ele deve colocá-lo para dormir. Eu tenho uma dificuldade em comparar valores no script, eu não consegui definir os números corretamente, alguém iria consertar isso, por favor? Aqui está a minha facada até agora

#!/bin/bash

max=65

val=$   sensors | grep '^temp1:' | sed -e 's/.*: \+\([+-][0-9.]\+\)°C.*$/0/'

while true; do
    if [[ "$val" > "$max" ]]; then
        sudo /etc/acpi/sleep.sh force
        sleep 1
    else
        sleep 10
    fi
    clear
    sensors
done

O texto acima obteve uma resposta com um script que, de acordo com os comentários, foi em algum momento atualizado para funcionar em 14.04 :

 #!/bin/bash

 while true; do
    val=$(sensors | awk '/temp1/ {print }')
    max="+75.0"
    if [[ "$val" > "$max" ]]; then
        dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
    fi
    sleep 10
    clear
    sensors
 done
 exit 0

Como indicado na pergunta vinculada, o script acima não funciona em 16.04.

Essa pergunta obteve uma resposta com uma versão simplificada do script:

 #!/bin/bash

 while true; do
    val=$(sensors | awk '/temp1/ {print }')
    max="+75.0"
    if [[ "$val" > "$max" ]]; then
        systemctl suspend
    fi
    clear
    sensors
 done
 exit 0

Mas enquanto faz o trabalho (o sistema vai dormir quando vai acima de 75), é preciso mais CPU do que o esperado e aumenta a temperatura durante a operação até 10 graus Celsius; isso é mais útil, mais frio quando não está rodando!

Eu não sei se o problema é com o script 11.04 inicial ou com a última alteração, mas isso precisa de uma nova resposta para 16.04.

    
por kenn 25.10.2012 / 13:36

4 respostas

9

Eu consegui fazer meu próprio script.

#!/bin/bash
while true; do
   val=$(sensors | awk '/temp1/ {print }')
   max="+75.0"
   if [[ "$val" > "$max" ]]; then
       dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
   fi
   sleep 10
   clear
   sensors
done
exit 0

Para 16.04 (também aqui ):

#!/bin/bash
while true; do
   val=$(sensors | awk '/temp1/ {print }')
   max="+75.0"
   if [[ "$val" > "$max" ]]; then
       systemctl suspend
   fi
   sleep 10
   clear
   sensors
done
exit 0
    
por kenn 15.01.2013 / 22:24
3

Introdução

Para facilitar tanto os usuários comutadores pré-systemd quanto pós-systemd, escrevi um script que tomará o método apropriado de suspensão com base no número da versão do sistema operacional. Essencialmente, ele faz a mesma coisa que o script atualizado do OP, exceto que ele obriga a suspender apesar dos inibidores com -i flag. Há várias considerações e melhorias que podem ser feitas no script, mas, por enquanto, essa versão faz 90% do trabalho.

Eu testei brevemente em 16.04 LTS, funciona perfeitamente bem. No futuro, posso reescrever isso em Python só porque posso ou por solicitação do usuário.

Origem do script

#!/usr/bin/env bash

suspend_system(){

    os_version=$(awk -F'["=]' '/VERSION_ID/{print substr(,1,2)}' /etc/os-release)
    if [ $os_version -ge 15   ]
    then
        systemctl suspend -i
        # Alternative way is to call login manager method via dbus
        # qdbus --system org.freedesktop.login1 /org/freedesktop/login1 \
        #       org.freedesktop.login1.Manager.Suspend True 

    else
        dbus-send --system --print-reply --dest="org.freedesktop.UPower"\
                  /org/freedesktop/UPower org.freedesktop.UPower.Suspend
    fi

}

is_critical_temp(){
    local temp=$(sensors | awk '/temp1/ {print substr(,2,2)}')
    if [ $temp -gt 75  ]
    then
        return 0
    else
        return 1
    fi
}

main(){

    while true
    do
        if is_critical_temp
        then
           # optional dialog if running from GUI, not necessary if running form /etc/rc.local
           #zenity --info --text "Reached critical temperature. Suspending in 10 seconds" &
           sleep 10
           suspend_system
        fi
    sleep 3
    done
}
main "$@"

Abordagem alternativa

Há algum tempo atrás, encontrei pm-suspend utility, de pm-utils package. Este programa funciona independentemente da versão do sistema operacional. A pequena desvantagem é que requer acesso root, mas é fácil contornar essa inconveniência.

O que eu pessoalmente faria seria o seguinte:

  1. sudo apt-get install pm-utils
  2. sudo visudo e adicione yourusername ALL = NOPASSWD: /usr/sbin/pm-suspend no final do arquivo.
  3. edite seu script para chamar sudo pm-suspend em vez do comando dbus.

Suspendendo uma máquina Ubuntu em geral

Você solicitou que as respostas utilizassem fontes confiáveis. Na verdade, Ask Ubuntu tem post canônico sobre a suspensão da linha de comando: Como posso suspender / hibernar a partir da linha de comando? Dependendo da abordagem e do nível de permissões que você deseja que seu script tenha, há várias maneiras de eliminar um gato lá. Alguns trabalham melhor que outros. Em minha resposta, forneci a abordagem dbus e systemctl, já que eles também funcionam com bloqueio de tela. Se você escrever para /sys/class/power/state , ele não bloqueará a tela, embora seja possível contornar isso com alguma mágica de script. Por ora, penso, a melhor abordagem é simplesmente determinar a versão do SO e selecionar o método apropriado como no meu script, ou usar pm-suspend alternative.

    
por Sergiy Kolodyazhnyy 26.01.2017 / 00:41
2

No meu sistema toda vez que sensors é executado, há uma falha na transmissão de vídeo. Tendo isso acontecer a cada 10 segundos ou no entanto o roteiro proposto é executado me deixaria louco. Uma solução melhor para suspender seria usar thermald da Intel e Powerclamp para desacelerar a CPU para reduzir o calor . Eu escrevi esta resposta para outra pergunta ( Parar cpu de superaquecimento ) e estou copiando aqui por conveniência.

Além disso, o script acima depende de temp1 , que é frequentemente corrompido no meu Ubuntu 16.04 e apenas temp3 é 100% confiável, o que não aparece em sensors . ou seja:

$ cat /sys/class/thermal/thermal_zone*/temp
27800
29800
58000

e de sensors :

acpitz-virtual-0
Adapter: Virtual device
temp1:        +27.8°C  (crit = +106.0°C)
temp2:        +29.8°C  (crit = +106.0°C)

Isso acontece depois da suspensão / retomada. A temperatura REAL é + 58,0 ° C, mas é falsamente relatada como + 27,8 ° C após a retomada. Assim, a proteção contra o calor só funcionaria uma vez para suspender e nunca mais funcionar até a reinicialização. Assim, o sistema atingiria crítico (+ 106.0 ° C), ponto no qual um desligamento total é executado e os dados podem ser corrompidos.

Então, aqui está minha solução recomendada para evitar o superaquecimento e a utilização de lentidão da CPU, em vez de suspender completamente o sistema.

Reduza a velocidade da CPU para reduzir o calor

Isso funciona para o Ubuntu 16.04+ com o Intel Sandy Bridge e processadores mais recentes.

De ( wiki.debian.org -thermald ) é o Debian (usado pelo Ubuntu) escreve sobre thermald , um daemon do Linux para resfriamento de tablets e laptops. Quando a temperatura do sistema atinge um certo limite, o daemon do Linux ativa vários métodos de resfriamento para resfriar o sistema.

O Linux thermal daemon (thermal) monitora e controla a temperatura em laptops, tablets com o mais recente Intel Sandy Bridge e as mais recentes versões da CPU da Intel. Quando a temperatura do sistema atinge um certo limite, o daemon do Linux ativa vários métodos de resfriamento para tentar resfriar o sistema.

Ele opera em dois modos:

Modo de configuração zero

  • Para a maioria dos usuários, isso deve ser suficiente para controlar a temperatura da CPU do sistema. Isso usa o sensor de temperatura DTS e usa o driver de estado Intel P, o driver de braçadeira de potência, o controle de Limite de potência médio em operação e o cpufreq como métodos de resfriamento.

Modo de configuração definido pelo usuário

  • Isso permite a configuração do estilo da ACPI em um arquivo de configuração XML térmico. Isso pode ser usado para consertar a configuração ou ajuste fino da ACPI, adicionando mais sensores e dispositivos de resfriamento. Este é um primeiro passo na implementação de um controle térmico de loop fechado no modo de usuário e pode ser aprimorado com base no feedback e nas sugestões da comunidade.

Como instalar

apt-get install thermald

Intel Powerclamp

O driver Powerclamp da Intel é definido aqui ( kernel.org - Intel Power Clamp.txt e faz parte do thermald descrito acima. Uma cotação direta para Powerclamp no link:

  

Considere a situação em que o consumo de energia de um sistema deve ser   reduzido em tempo de execução, devido a orçamento de energia, restrição térmica ou ruído   nível, e onde o resfriamento ativo não é o preferido. Software gerenciado   redução de potência passiva deve ser executada para evitar o   ações projetadas para cenários catastróficos.

     

Atualmente, estados P, estados T (modulação de relógio) e delineamento de CPU   são usados para otimização da CPU.

     

Nos processadores Intel, os estados C fornecem redução efetiva de energia, mas até agora   eles são usados apenas oportunisticamente, com base na carga de trabalho. Com o   desenvolvimento do driver intel_powerclamp, o método de sincronização   a injeção inativa em todos os encadeamentos de CPU on-line foi introduzida. O objetivo   é alcançar a residência de estado C forçada e controlável.

     

Teste / Análise foi feito nas áreas de energia, desempenho,   escalabilidade e experiência do usuário. Em muitos casos, a vantagem clara é   mostrado ao colocar a CPU offline ou modulando o clock da CPU.

Como você sabe que o Powerclamp está funcionando?

O Powerclamp só pode ser exibido uma vez por ano quando as ventoinhas do ventilador ficam muito empoeiradas & amp; lint. Então, como você sabe que está realmente rodando em segundo plano? Use:

lsmod | grep intel

E você deve ver uma lista semelhante a esta:

btintel                16384  1 btusb
bluetooth             520192  29 bnep,btbcm,btrtl,btusb,rfcomm,btintel
intel_rapl             20480  0
intel_powerclamp       16384  0
   (.... more intel drivers ....)
snd                    81920  18 snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_hda_codec_idt,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec_generic,snd_hda_codec,snd_hda_intel,snd_seq_device

Se você vir intel_rapl e intel_powerclamp , sabe que está funcionando e simplesmente espera que os temporários excedam 85ºC.

Powerclamp em ação exibido por Conky

Aqui está uma captura de tela quando o Powerclamp injeta ciclos de sono:

Normalmente, neste sistema, a velocidade do clock da CPU é de 2400 Mhz a 3400 Mhz ao assistir vídeo HTML5 e 10 abas do Chrome abertas. Normalmente, a utilização da CPU é de cerca de 9% a 12% em 8 CPUs. Quando as coisas ficam muito quentes ( 86C ) Powerclamp entra em ação e isso acontece:

  • A velocidade da CPU é reduzida para 1200 Mhz.
  • A utilização da CPU atinge até 80%. Isso é enganoso, porque o acréscimo de 70% é o tempo de dormir.
  • Os 9 principais processos da CPU normalmente são 5 ou 6 processos do Chrome, além de Xorg, Conky, Pulse Audio e um kworker ocasional. No entanto, agora 8 dos 10 principais são o processo kidle_inject / x , em que x é de 0 a 7. Nas primeiras 8 CPUs.

O driver Powerclamp é executado até que os temporários caiam abaixo de 85ºC novamente. Enquanto o driver está em execução, você pode dividir a segunda pausa nos seus vídeos e, possivelmente, dividir o segundo e o atraso do mouse.

Desativar o Intel Turbo Boost

De volta aos "dias antigos e legais" do Ubuntu 14.04, o Intel Turbo Boost foi quebrado, então minha velocidade do processador oscilou entre 1200 Mhz e 2400 Mhz. Após a atualização para o Ubuntu 16.04, ele aumentaria para 3400 Mhz (3,4 Ghz), porque o Turbo Boost estava finalmente funcionando. Mas também elevou o calor.

Para desativar o uso do Intel Turbo Boost:

echo "1" | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
    
por WinEunuuchs2Unix 27.01.2017 / 04:23
0

Eu editei radicalmente a questão acima a fim de pedir atualizações para 16.04 e minha resposta abaixo é, portanto, apenas uma atualização para o resposta inicial por Kenn , na qual eu postei uma pergunta duplicada e também é um responder sob isso.

Como o erro em 16.04 foi Error org.freedesktop.DBus.Error.UnknownMethod: No such method 'Suspend' , após o comentário feito por Nick Sillito em minha pergunta duplicada ligando para esta resposta, modifiquei o script substituindo toda esta parte:

    dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

com

    systemctl suspend

Como indicado no comentário feito por wjandreea em a pergunta duplicada : sleep 10 ou um valor similar não deve ser removido (como eu fiz inicialmente); sem essa linha, o script modificado usará mais energia porque, em vez de ser executado a cada 10 segundos, será o mais rápido possível - mais de várias dezenas de vezes por segundo.

Neste ponto, o sistema adormece quando ultrapassa o nível definido na linha

max="+75.0"

Como eu quero um valor mais alto, 82, o script que eu uso é:

#!/bin/bash

while true; do
   val=$(sensors | awk '/temp1/ {print }')
   max="+82.0"
   if [[ "$val" > "$max" ]]; then
                        systemctl suspend

   fi
   sleep 10
   clear
   sensors
done
exit 0
    
por cipricus 27.01.2017 / 13:13