Add run-with-governor script
This commit is contained in:
74
run-with-governor
Executable file
74
run-with-governor
Executable file
@@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
# ./run-with-governor.sh - temporarily use specific CPU governor while a
|
||||||
|
# command is running
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
# run-with-governor GOVERNOR COMMAND [ARGS...]
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
# run-with-governor performance make -j8
|
||||||
|
#
|
||||||
|
# Runs `make -j8` with the CPU governor set to "performance".
|
||||||
|
#
|
||||||
|
# EXIT STATUS
|
||||||
|
# Exits with the status of COMMAND, or 1 if parameters are wrong GOVERNOR is
|
||||||
|
# invalid.
|
||||||
|
#
|
||||||
|
# HINT
|
||||||
|
# The sudoers file can be changed to allow cpupower without a sudo password
|
||||||
|
# prompt (at your own risk):
|
||||||
|
#
|
||||||
|
# 1. Run `sudo visudo`
|
||||||
|
#
|
||||||
|
# 2. Add the following:
|
||||||
|
# ```
|
||||||
|
# # allow cpupower without password
|
||||||
|
# myusername ALL=(root) NOPASSWD: /usr/bin/cpupower frequency-set -g *
|
||||||
|
# myusername ALL=(root) NOPASSWD: /usr/bin/cpupower ^-c [0-9]+ frequency-set -g .+$
|
||||||
|
# ```
|
||||||
|
#
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# References:
|
||||||
|
# https://man7.org/linux/man-pages/man1/cpupower.1.html
|
||||||
|
# https://man7.org/linux/man-pages/man5/sudoers.5.html
|
||||||
|
# https://docs.kernel.org/admin-guide/pm/cpufreq.html
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo $@ > /dev/stderr
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $# -lt 2 ]]; then
|
||||||
|
die "Usage: ${0} [governor] [command]"
|
||||||
|
fi
|
||||||
|
|
||||||
|
desired_governor=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
if ! grep -Fw "${desired_governor}" \
|
||||||
|
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors >/dev/null;
|
||||||
|
then
|
||||||
|
die "Governor doesn't exist"
|
||||||
|
fi
|
||||||
|
|
||||||
|
declare -A cpus=()
|
||||||
|
for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
|
||||||
|
num=${f//[^0-9]/}
|
||||||
|
cpus["${num}"]=$(cat "${f}")
|
||||||
|
done
|
||||||
|
|
||||||
|
restore_governor() {
|
||||||
|
for i in "${!cpus[@]}"; do
|
||||||
|
sudo cpupower -c "${i}" frequency-set -g "${cpus[${i}]}" >/dev/null
|
||||||
|
done
|
||||||
|
}
|
||||||
|
trap restore_governor EXIT
|
||||||
|
|
||||||
|
sudo cpupower frequency-set -g "${desired_governor}" >/dev/null
|
||||||
|
|
||||||
|
"$@"
|
||||||
Reference in New Issue
Block a user