O script Bash tem problemas dependendo do ambiente de área de trabalho. Como consertar isto?

4

Sistema: Ubuntu 16.04.1 Xenial Xerus

Oi,

Estou tendo um problema estranho com meu script bash usado para controlar a velocidade do ventilador da GPU.

Este script altera a velocidade do ventilador da GPU se a GPU passar para outro intervalo de temperatura.

Código:

#!/bin/bash

interval=5

while true; do

current_temp='nvidia-settings -query GPUCoreTemp| grep gpu | perl -ne 'print $1 if /GPUCoreTemp.*?: (\d+)./;''

if (("$current_temp" < 45)); then
    nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=40

elif (("$current_temp" > 45)) && (("$current_temp" < 60)); then
    nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=50

elif (("$current_temp" > 60)) && (("$current_temp" < 65)); then
    nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=60

elif (("$current_temp" > 65)) && (("$current_temp" < 70)); then
    nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=70

elif (("$current_temp" > 70)) && (("$current_temp" < 75)); then
    nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=80

elif (("$current_temp" > 75)); then
    nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=100

fi
sleep "$interval"
done

No Unity DE, Gnome e KDE, este script funciona sem falhas usando ./nvautofan.sh , mas este script apresenta um erro se eu chamar o mesmo comando no XFCE4 (usando bash -x ./nvautofan.sh para depuração):

Saída de depuração do Gnome (esperada):

+ interval=5
+ true
++ perl -ne 'print $1 if /GPUCoreTemp.*?: (\d+)./;'
++ grep gpu
++ nvidia-settings -query GPUCoreTemp
+ current_temp=37 # Proper output
+ (( 37 < 45 ))
+ nvidia-settings -a '[gpu:0]/GPUFanControlState=1' -a '[fan:0]/GPUTargetFanSpeed=40'

Attribute 'GPUFanControlState' (LINUX-RIG:0[gpu:0]) assigned value 1.

Attribute 'GPUTargetFanSpeed' (LINUX-RIG:0[fan:0]) assigned value 40.

+ sleep 5
# ...

nvidia-settings -query GPUCoreTemp Output (Gnome)

Attribute 'GPUCoreTemp' (LINUX-RIG:0.0): 39.
    'GPUCoreTemp' is an integer attribute.
    'GPUCoreTemp' is a read-only attribute.
    'GPUCoreTemp' can use the following target types: X Screen, GPU.
Attribute 'GPUCoreTemp' (LINUX-RIG:0[gpu:0]): 39.
    'GPUCoreTemp' is an integer attribute.
    'GPUCoreTemp' is a read-only attribute.
    'GPUCoreTemp' can use the following target types: X Screen, GPU.

Saída de depuração XFCE4 (não funcional)

+ interval=5
+ true
++ nvidia-settings -query GPUCoreTemp
++ grep gpu
++ perl -ne 'print $1 if /GPUCoreTemp.*?: (\d+)./;'
+ current_temp= # An error appeared here
+ ((  < 45 ))
nvautofan.sh: line 15: ((: < 45: syntax error: operand expected (error token is "< 45")
+ ((  > 45 ))
nvautofan.sh: line 17: ((: > 45: syntax error: operand expected (error token is "> 45")
+ ((  > 60 ))
nvautofan.sh: line 19: ((: > 60: syntax error: operand expected (error token is "> 60")
+ ((  > 65 ))
nvautofan.sh: line 21: ((: > 65: syntax error: operand expected (error token is "> 65")
+ ((  > 70 ))
nvautofan.sh: line 23: ((: > 70: syntax error: operand expected (error token is "> 70")
+ ((  > 75 ))
nvautofan.sh: line 25: ((: > 75: syntax error: operand expected (error token is "> 75")
+ sleep 5
# ...

nvidia-settings -query GPUCoreTemp Output (XFCE)

Attribute 'GPUCoreTemp' (LINUX-RIG:0.0): 38.
    'GPUCoreTemp' is an integer attribute.
    'GPUCoreTemp' is a read-only attribute.
    'GPUCoreTemp' can use the following target types: X Screen, GPU.

Então, enfrentando esse problema, tentei trabalhar com isso usando sh ./nvautofan.sh , mas descobri um erro que cria arquivos na minha pasta de script (o script continua não funcional):

+ interval=5
+ true
+ nvidia-settings -query GPUCoreTemp
+ grep gpu
+ perl -ne print $1 if /GPUCoreTemp.*?: (\d+)./;
+ current_temp=
nvautofan.sh: 15: nvautofan.sh: cannot open 45: No such file
+ 
nvautofan.sh: 15: nvautofan.sh: : Permission denied
+ 
nvautofan.sh: 17: nvautofan.sh: : Permission denied
+ 
nvautofan.sh: 19: nvautofan.sh: : Permission denied
+ 
nvautofan.sh: 21: nvautofan.sh: : Permission denied
+ 
nvautofan.sh: 23: nvautofan.sh: : Permission denied
+ 
nvautofan.sh: 25: nvautofan.sh: : Permission denied
+ sleep 5
# ...

Como posso resolver este problema para executar este script no XFCE corretamente?

Obrigado.

    
por Murcio Filho 01.08.2016 / 05:16

1 resposta

5

O problema é que (por qualquer razão) a saída de nvidia-settings -query GPUCoreTemp no XFCE não contém a string gpu . Mostra apenas o primeiro conjunto de linhas comparado com a saída do mesmo comando executado sob o GNOME. Isso significa que current_temp estará vazio e que as expansões aritméticas depois falharão.

A execução do script em sh não corrigirá isso.

O script bash a seguir selecionará o número no final da primeira linha de saída e o usará como a temperatura atual ( Editar: modificado para usar outro comando após os comentários).

#!/bin/bash

function set_fan_speed {
    local speed="$1"

    nvidia-settings -a "[gpu:0]/GPUFanControlState=1" \
        -a "[fan:0]/GPUTargetFanSpeed=$speed"
}

interval=5

while true; do
    current_temp="$( nvidia-smi -a |
      grep -F 'GPU Current Temp' | awk '{ print $(NF-1) }' )"

    if [[ -z "$current_temp" ]]; then
        echo "Something isn't right, current_temp is empty" >&2
        exit 1
    fi

    if   (( current_temp < 45 )); then set_fan_speed 40
    elif (( current_temp < 60 )); then set_fan_speed 50
    elif (( current_temp < 65 )); then set_fan_speed 60
    elif (( current_temp < 70 )); then set_fan_speed 70
    elif (( current_temp < 75 )); then set_fan_speed 80
    else                               set_fan_speed 100
    fi

    sleep "$interval"
done

Eu coloquei o comando longo em uma função para facilitar a leitura e removi testes aritméticos desnecessários. Eu também inseri uma verificação de sanidade para current_temp .

Uma melhoria futura deste script pode incluir não tocar na velocidade do ventilador se não precisar ser modificado. Manter o controle da velocidade atual do ventilador e não atualizá-lo em set_fan_speed , se não for necessário, seria o caminho óbvio a seguir.

Observação: na verdade, não sei se a chamada nvidia-settings na função set_fan_speed funciona . Pode ser que [gpu:0]/ deva ser removido ou que alguma outra modificação precise ser feita para que o script seja executado no GNOME e no XFCE. Minha solução, pelo menos, cuida do problema primário de analisar a temperatura.

    
por 01.08.2016 / 09:26