Я запускаю 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
Но то, что он выводит, это только:
CPU 3 (МГц): 1536 (мин 480, максимум 1536) ТЕМПЕРАТУРА: 74 ПАМЯТЬ (МГц): 672 (мин. 408, макс. 672)Я не очень много помню о сценариях bash, это было много лет, но, пожалуйста, что мне не хватает? Заранее спасибо;)
У вас есть:
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
У вас есть:
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
У вас есть:
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