bash script para exibir informações de cpu, ddr, temperatura no Ubuntu Xenial mostrando apenas core 3 info

0

Estou rodando o Ubuntu Xenial em um Orange Pi com o AllWinner H3 QuadCore Arm V7, e preciso monitorar constantemente a freqüência e temp da cpu, então eu tenho esse script bash para me ajudar, mas a questão é que ele apenas calça o núcleo 3 informações, não as outras.

#/bin/bash
while (true); do
## retrieves core 0 info
    cpu0_cur=$(( 'cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq' / 1000 ))
    cpu0_max=$(( 'cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq' / 1000 ))
    cpu0_min=$(( 'cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq' / 1000 ))
    cpu0_cur="$(printf "%4s" $cpu0_cur)"
    cpu0_max="$(printf "%4s" $cpu0_max)"
    cpu0_min="$(printf "%4s" $cpu0_min)"
## retrieves core 1 info
    cpu1_cur=$(( 'cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq' / 1000 ))
    cpu1_max=$(( 'cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq' / 1000 ))
    cpu1_min=$(( 'cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq' / 1000 ))
    cpu1_cur="$(printf "%4s" $cpu1_cur)"
    cpu1_max="$(printf "%4s" $cpu1_max)"
    cpu1_min="$(printf "%4s" $cpu1_min)"
## retrieves core 2 info
    cpu2_cur=$(( 'cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq' / 1000 ))
    cpu2_max=$(( 'cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq' / 1000 ))
    cpu2_min=$(( 'cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq' / 1000 ))
    cpu2_cur="$(printf "%4s" $cpu2_cur)"
    cpu2_max="$(printf "%4s" $cpu2_max)"
    cpu2_min="$(printf "%4s" $cpu2_min)"
## retrieves core 3 info
    cpu3_cur=$(( 'cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_cur_freq' / 1000 ))
    cpu3_max=$(( 'cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq' / 1000 ))
    cpu3_min=$(( 'cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq' / 1000 ))
    cpu3_cur="$(printf "%4s" $cpu3_cur)"
    cpu3_max="$(printf "%4s" $cpu3_max)"
    cpu3_min="$(printf "%4s" $cpu3_min)"
## retrieves system temp
    tempr='cat /sys/devices/virtual/hwmon/hwmon1/temp1_input'
    tempr="$(printf "%3s" $tempr)"
## retrieves ddr info
    ddr_cur=$(( 'cat /sys/devices/platform/sunxi-ddrfreq/devfreq/sunxi-ddrfreq/cur_freq' / 1000 ))
    ddr_max=$(( 'cat /sys/devices/platform/sunxi-ddrfreq/devfreq/sunxi-ddrfreq/max_freq' / 1000 ))
    ddr_min=$(( 'cat /sys/devices/platform/sunxi-ddrfreq/devfreq/sunxi-ddrfreq/min_freq' / 1000 ))
    ddr_cur="$(printf "%4s" $ddr_cur)"
    ddr_max="$(printf "%4s" $ddr_max)"
    ddr_min="$(printf "%4s" $ddr_min)"
## prints results
    echo -ne "  CORE 0 (MHz): $cpu0_cur (min $cpu0_min, max $cpu0_max)  TEMPERATURE: $tempr  MEMORY (MHz): $ddr_cur (min $ddr_min, max $ddr_max)   "\r
    echo -ne "  CORE 1 (MHz): $cpu1_cur (min $cpu1_min, max $cpu1_max)  TEMPERATURE: $tempr  MEMORY (MHz): $ddr_cur (min $ddr_min, max $ddr_max)   "\r
    echo -ne "  CORE 2 (MHz): $cpu2_cur (min $cpu2_min, max $cpu2_max)  TEMPERATURE: $tempr  MEMORY (MHz): $ddr_cur (min $ddr_min, max $ddr_max)   "\r
    echo -ne "  CORE 3 (MHz): $cpu3_cur (min $cpu3_min, max $cpu3_max)  TEMPERATURE: $tempr  MEMORY (MHz): $ddr_cur (min $ddr_min, max $ddr_max)   "\r
    sleep 0.2
done

Mas o resultado é apenas isso:

CPU 3 (MHz): 1536 (min 480, max 1536) TEMPERATURE: 74 MEMORY (MHz): 672 (min 408, max 672)

Não me lembro de muito sobre scripts de bash, já faz muitos anos, mas, por favor, o que me falta? Obrigado antecipadamente;)

    
por Paul C. 24.11.2017 / 05:52

1 resposta

1

Você tem:

echo -ne "..."\r

O que significa:

  • -n : não imprime uma nova linha no final, portanto, qualquer comando subsequente é iniciado na mesma linha
  • -e : interprete sequências de escape de barra invertida, portanto:
  • \r se torna retorno de carro, e o próximo comando inicia a saída do início da mesma linha

Assim, todos os seus comandos são impressos na mesma linha, cada um substituindo o anterior e somente o último é visível. Remova o -ne e o \r :

echo "  CORE 0 (MHz): $cpu0_cur (min $cpu0_min, max $cpu0_max)  TEMPERATURE: $tempr  MEMORY (MHz): $ddr_cur (min $ddr_min, max $ddr_max)   "

Além disso, você não precisa de todas essas variáveis:

while true; do
    tempr=$(cat /sys/devices/virtual/hwmon/hwmon1/temp1_input)
    ## retrieves ddr info
    ddr_cur=$(( $(cat /sys/devices/platform/sunxi-ddrfreq/devfreq/sunxi-ddrfreq/cur_freq) / 1000 ))
    ddr_max=$(( $(cat /sys/devices/platform/sunxi-ddrfreq/devfreq/sunxi-ddrfreq/max_freq) / 1000 ))
    ddr_min=$(( $(cat /sys/devices/platform/sunxi-ddrfreq/devfreq/sunxi-ddrfreq/min_freq) / 1000 ))
    for i in {0..3}; do
        ## retrieves core info
        cur=$(( $(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_cur_freq) / 1000 ))
        max=$(( $(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_max_freq) / 1000 ))
        min=$(( $(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_min_freq) / 1000 ))
    ## retrieves system temp
        printf '\tCORE %d (MHz): %4s (min %4s, max %4s)  TEMPERATURE: %4s MEMORY (MHz): %4s(min %4s, max %4s)\n' $i "$cur" "$min" "$max" "$tempr" "$ddr_cur" "$ddr_min" "$ddr_max"
    done
    sleep 0.2
done
    
por muru 24.11.2017 / 06:08