Añadido Change_Powerv2

This commit is contained in:
2025-09-29 21:16:17 +02:00
parent 3249baf96a
commit 18f655a8ef
+111
View File
@@ -0,0 +1,111 @@
#!/usr/bin/env bash
# Robust power profile applier: nunca peta y siempre intenta un fallback.
# Uso: power_profile.sh [ac|bat] (si no pasas arg, autodetecta con AC0/online)
# --- Config perfiles ---
AC_GOV="performance"
BAT_GOV="schedutil" # fallback a powersave si no existe
AC_EPP="performance" # si hay amd-pstate-epp; si no, ignorado
BAT_EPP="balance_power"
AC_BOOST="1" # si /sys/devices/system/cpu/cpufreq/boost existe
BAT_BOOST="0"
MODE="${1:-}"
log(){ echo "[power-profile] $*"; logger -t power-profile -- "$*"; }
# Autodetecta modo si no se pasa arg
if [[ -z "$MODE" ]]; then
if [[ -r /sys/class/power_supply/AC0/online ]] && [[ "$(cat /sys/class/power_supply/AC0/online 2>/dev/null)" == "1" ]]; then
MODE="ac"
else
MODE="bat"
fi
fi
# Normaliza modo
case "$MODE" in
ac|AC) MODE="ac" ;;
bat|battery|BAT) MODE="bat" ;;
*) log "Modo inválido: '$MODE' (usa ac|bat)"; exit 0 ;;
esac
read_avail_govs() {
local f="/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"
[[ -r "$f" ]] && cat "$f" || echo "" # puede venir vacío con algunos drivers
}
try_set_governor() {
local desired="$1"
local alt1 alt2
# Orden de preferencia de fallback según modo
if [[ "$MODE" == "ac" ]]; then
alt1="performance"; alt2="schedutil"
else
alt1="schedutil"; alt2="powersave"
fi
local applied=""
local govs_to_try=("$desired" "$alt1" "$alt2" "powersave" "performance" "schedutil")
# Elimina duplicados manteniendo orden
local uniq=(); local seen=""
for g in "${govs_to_try[@]}"; do
[[ "$seen" =~ (^| )"$g"( |$) ]] || { uniq+=("$g"); seen+="$g "; }
done
# Si sabemos los disponibles, filtra
local avail; avail="$(read_avail_govs)"
if [[ -n "$avail" ]]; then
local filtered=()
for g in "${uniq[@]}"; do
grep -qw -- "$g" <<<"$avail" && filtered+=("$g")
done
[[ ${#filtered[@]} -gt 0 ]] && uniq=("${filtered[@]}")
fi
for g in "${uniq[@]}"; do
local ok=1
for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
[[ -w "$f" ]] || continue
printf "%s" "$g" > "$f" 2>/dev/null || { ok=0; break; }
done
if [[ $ok -eq 1 ]]; then applied="$g"; break; fi
done
if [[ -n "$applied" ]]; then
log "governor=$applied"
else
log "no se pudo aplicar ningún governor (driver/permisos)."
fi
}
set_epp_all() {
local epp="$1"
shopt -s nullglob
local files=(/sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference)
[[ ${#files[@]} -eq 0 ]] && return 0
for f in "${files[@]}"; do
printf "%s" "$epp" > "$f" 2>/dev/null || true
done
log "epp=$epp"
}
set_boost() {
local v="$1" f="/sys/devices/system/cpu/cpufreq/boost"
[[ -w "$f" ]] && { printf "%s" "$v" > "$f" 2>/dev/null || true; log "boost=$v"; }
}
apply_ac() {
try_set_governor "$AC_GOV"
set_epp_all "$AC_EPP"
set_boost "$AC_BOOST"
}
apply_bat() {
try_set_governor "$BAT_GOV"
set_epp_all "$BAT_EPP"
set_boost "$BAT_BOOST"
}
if [[ "$MODE" == "ac" ]]; then
apply_ac
else
apply_bat
fi
exit 0