bash скрипт для отображения информации о процессоре, ddr, температуре в Ubuntu Xenial, показывающий только информацию о ядре 3

Я использую Ubuntu Xenial на Orange Pi с AllWinner H3 QuadCore Arm V7, и мне нужно постоянно следить за частотой и температурой процессора, поэтому мне нужен этот сценарий bash, но проблема в том, что он загружает только ядро 3 информация, а не остальные.

#/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

Но он выдает только следующее:

ЦП 3 (МГц): 1536 (мин. 480, макс. 1536) ТЕМПЕРАТУРА: 74 ПАМЯТЬ (МГц): 672 (мин. 408, макс. 672)

Я мало что помню о сценариях bash, прошло много лет, но, пожалуйста, чего мне не хватает? Заранее спасибо;)

0
задан 24 November 2017 в 16:02

1 ответ

У вас есть:

echo -ne "..."\\r

Что означает:

  • -n: не выводить символ новой строки в конце, поэтому любая последующая команда начинается в той же строке
  • -e: интерпретировать escape-последовательности обратной косой черты, поэтому:
  • \r становится переводом каретки, и следующая команда начинает вывод с начала той же строки

Таким образом, все ваши команды печатаются в одну и ту же строку, каждая перезаписывает предыдущую, и видна только последняя. Удалите -ne и \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)   "

Кроме того, вам не нужны все эти переменные:

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
1
ответ дан 24 November 2017 в 16:02

Другие вопросы по тегам:

Похожие вопросы: