diff --git a/freqcpu b/freqcpu new file mode 100755 index 0000000..e378fd2 --- /dev/null +++ b/freqcpu @@ -0,0 +1,141 @@ +#!/bin/bash + +# Configuration file +config_file=/etc/freqcpu/freqcpu.conf + +# Default config +cores_cpu=$(grep -c ^processor /proc/cpuinfo 2> /dev/null) +freq_min="2000Mhz" +freq_max="3600Mhz" +governor=$(cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 2> /dev/null | head -1) +#governor=powersave + +# Check dependencies +path_check="/usr/bin /bin /usr/local/bin $HOME/.local/bin $(brew --prefix 2> /dev/null)/bin" +dependencies="dirname basename cpufreq-set expr cat watch grep" +dependencies_found="" +dependencies_not_found="" +for checkPath in $path_check ; do + for checkDependencies in $dependencies ; do + if [ -f $checkPath/$checkDependencies ] ; then + dependencies_found="$dependencies_found $checkDependencies" + fi + done +done +for notFound in $dependencies ; do + check_found_one=$(echo $dependencies_found | grep " $notFound") + check_found_two=$(echo $dependencies_found | grep "$notFound ") + if_not_found="$check_found_one$check_found_two" + if [ -z "$if_not_found" ] ; then + dependencies_not_found="$dependencies_not_found $notFound" + fi +done +# Show if all tools are installed +if [ -z "$dependencies_not_found" ] ; then + echo > /dev/null +else + echo "$(basename $0): Some required tools are not installed:$dependencies_not_found" + exit 1 +fi + +# Function to check root permissions +function check_root() { + mkdir -p /etc/root 2> /dev/null + rootperm=$? + if [ $rootperm -eq 0 ] ; then + rm -rf /etc/root + else + echo "$(basename $0): Root permission is required to perform this operation" + exit + fi +} + +function help() { + echo "" + if [ -f ${config_file} ] ; then + source ${config_file} + fi + echo "$(basename $0) - limit CPU frequency" + echo "" + echo "* Config:" + echo " freq_min: ${freq_min}" + echo " freq_max: ${freq_max}" + echo " cores_cpu: ${cores_cpu}" + echo " governor: ${governor}" + echo "" + echo "* Syntax:" + echo "" + echo " $(basename $0) -c --> create initial configuration file" + echo " $(basename $0) -d --> run daemon for set CPU frequency" + echo " $(basename $0) -r --> set limit CPU frequency" + echo " $(basename $0) -f --> show current CPU frequency" + echo " $(basename $0) -g --> show current CPU governor" + echo " $(basename $0) -o --> show CPU cores" + echo " $(basename $0) -h --> show help" + echo "" + exit 0 +} + +function create_config() { + mkdir -p /etc/freqcpu + echo "cores_cpu=${cores_cpu} # Set number of CPUs" > ${config_file} + echo "freq_min=${freq_min}" >> ${config_file} + echo "freq_max=${freq_max}" >> ${config_file} + echo "governor=${governor} # Set powersave, performance, balanced" >> ${config_file} + echo "$(basename $0): created ${config_file} successfully" + exit 0 +} + +function check_config() { + if [ -f ${config_file} ] ; then + source ${config_file} + else + echo "$(basename $0): no configuration file exists in /etc/freqcpu/freqcpu.conf" + echo "$(basename $0): first run the command -> freqcpu -c" + exit 0 + fi +} + +# Run commands +if [ "${1}" == "-d" ] ; then + check_root + check_config + source ${config_file} + echo "$(basename $0) - running limit CPU frequency daemon" + sleep 10 + frecuency=0 + num_cpus_total=$(expr ${cores_cpu} - 1) + num_cpu=0 + while [ ${frecuency} -eq 0 ] ; do + while [ ${num_cpu} -le ${num_cpus_total} ] ; do + echo "set CPU ${num_cpu} freq (${freq_min}/${freq_max}) (governor: ${governor})" + cpufreq-set --cpu ${num_cpu} --min ${freq_min} --max ${freq_max} --governor ${governor} + num_cpu=$(expr ${num_cpu} + 1) + done + sleep 3600 + done +elif [ "${1}" == "-c" ] ; then + check_root + create_config +elif [ "${1}" == "-r" ] ; then + check_root + check_config + source ${config_file} + num_cpus_total=$(expr ${cores_cpu} - 1) + num_cpu=0 + while [ ${num_cpu} -le ${num_cpus_total} ] ; do + echo "set CPU ${num_cpu} freq (${freq_min}/${freq_max}) (governor: ${governor})" + cpufreq-set --cpu ${num_cpu} --min ${freq_min} --max ${freq_max} --governor ${governor} + num_cpu=$(expr ${num_cpu} + 1) + done +elif [ "${1}" == "-f" ] ; then + watch -n1 "cat /proc/cpuinfo | grep \"^[c]pu MHz\"" +elif [ "${1}" == "-g" ] ; then + cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 2> /dev/null | head -1 +elif [ "${1}" == "-o" ] ; then + grep -c ^processor /proc/cpuinfo 2> /dev/null +else + help +fi + +