GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Gui oder einfaches Bash-Skript zum Drosseln der CPU?

Ich habe ein Problem mit einem Chuwi Hi10 Pro. Es tritt unter Linux und Windows auf.
Wenn die Bildschirmhelligkeit zu hoch ist oder die CPU zu 100 % ausgelastet ist, beginnt sich der Akku zu entladen, während das Gerät angeschlossen ist. Bei Verwendung eines USB 3.0-QC-Ladegeräts ist dies ein sehr langsamer Stromverbrauch, aber ich möchte das Tablet ziemlich zuverlässig rund um die Uhr eingeschaltet lassen.

Ich würde gerne wissen, ob es eine einfache Methode gibt, vorzugsweise eine GUI oder ein einfaches Bash-Skript, um die CPU zu drosseln (Energieverwaltung) und in den Hochleistungsmodus zurückzukehren.

Ich möchte es für Dienste wie Kodi verwenden; Es kann die Videowiedergabe nicht durcheinander bringen, wenn sie ein wenig gedrosselt wird.

Nebenfrage, abgesehen von den Akkuinformationen, gibt es eine Möglichkeit, die Stromstärke und Watt von einem Netzteil zu erfahren?

Beste Antwort

cpuf – Einfache Bash-GUI zum Einstellen der minimalen/maximalen CPU-Frequenz

Vorführung

In dieser Demo cpuf Fenster ist links und conky Systeminformationen befinden sich auf der rechten Seite. So läuft die Demo ab:

  • Demo startet, während YouTube-Video bereits läuft
  • Standard-CPU-min/max-Frequenzen sind 800 / 3500
  • CPU min/max auf 800 überschreiben / 800 und die CPU-Auslastung steigt auf 20 %
  • CPU min/max auf 3500 überschreiben / 3500 und die CPU-Auslastung sinkt auf 10 %
  • Demo kehrt zurück und beginnt erneut

Mit drei Monitoren cpuf kann in 10 Fuß Entfernung erscheinen, verwenden Sie also Parameter 1 --geometry Option, um es in die Nähe von conky zu stellen :

sudo cpuf --geometry="450x450+4720+80" //eadn-wc01-5196795.nxedge.io/home/rick/Pictures/icons/cpu-intel-128.svg
  • Parameter 1 --geometry ist Fensterbreite x Höhe + Breitenversatz + Höhenversatz
  • Parameter 2 kann Ihr eigenes Symbol sein (in diesem Fall Intel-CPU-Image), andernfalls ist es standardmäßig das Computersymbol

cpuf Bash-Skript

Dieser Abschnitt erfordert, dass Sie ein Terminal mit Strg öffnen +Alt +T .

Einrichtung

Um zu funktionieren, cpuf Bash-Skript erfordert:

sudo apt install yad         # from the repository universe
sudo apt install coreutils   # installed by default in most distros

Am einfachsten ist es, wenn Sie cpuf platzieren script in ein root-eigenes Verzeichnis innerhalb Ihres Suchpfads. Zum Beispiel:/usr/local/bin .

Um cpuf zu erstellen Skript öffnen Sie den Editor mit sudo -H gedit /usr/local/bin/cpuf .

  • Markieren Sie die Zeilen im Abschnitt unten
  • Klicken Sie mit der rechten Maustaste und wählen Sie „Kopieren“
  • Wechseln Sie zurück zu Ihrem Editor
  • Klicken Sie mit der rechten Maustaste und wählen Sie „Einfügen“
  • Wählen Sie im Editor-Menü „Speichern“ und dann „Beenden“

Machen Sie das Skript mit sudo chmod a+x /usr/local/bin/cpuf ausführbar .

cpuf Code zum Kopieren in Ihren Editor

#!/bin/bash

# NAME: cpuf (Pronounced SEA-PUFF)
# CALL: sudo cpuf
# PARM: $1 = --geometry=WidthxHeight+VertOffset+HorizOffset
#       $2 = Optional image icon

# DESC: Simple GUI script to set CPU Min and Max Frequency.
#       For Ask Ubuntu Question: https://askubuntu.com/q/1141605/307523
# DATE: May 12, 2019.
# UPDT: No updates yet.
# NOTE: No notes yet.

### Dependancies ###

command -v yad >/dev/null 2>&1 || { echo >&2 
        "yad package required but it is not installed.  Aborting."; 
        exit 1; }

command -v nproc >/dev/null 2>&1 || { echo >&2 
        "coreutils package required but it is not installed.  Aborting."; 
        exit 2; }

if [[ $(id -u) != 0 ]]; then # root powers needed to call this script
    echo >&2 Must be called with sudo powers
    exit 3
fi

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical 
    "$0 cannot be run from GUI without TERM environment variable."
    exit 4
fi

### Program constants ###

## Yad Window parameters
# Hard code Height & Width to suit your screen resolution and scaling factor
GEOMETRY="--width 400 --height 500"
# Pass Parameter 1 with ---geometry="WidxHgt+WidOff+HgtOff" to override
[[ "$1" == --geometry=* ]] && GEOMETRY="$1"

TITLE="cpuf"
TEXT="Set CPU Min/Max Frequencies"
ICON="//eadn-wc01-5196795.nxedge.io/usr/share/icons/Adwaita/48x48/devices/computer.png"
# Pass Parameter 2 with icon for window image
# Intel CPU comes from: https://www.gnome-look.org/p/1107932/
[[ ! -z "$2" ]] && ICON="$2"

## Virtual File System directories
      CPU0_DIR=/sys/devices/system/cpu/cpu0/cpufreq
    PSTATE_DIR=/sys/devices/system/cpu/intel_pstate
 CURR_MIN_FREQ="$CPU0_DIR/scaling_min_freq"
 CURR_MAX_FREQ="$CPU0_DIR/scaling_max_freq"
ALLOW_MIN_FREQ="$CPU0_DIR/cpuinfo_min_freq"
ALLOW_MAX_FREQ="$CPU0_DIR/cpuinfo_max_freq"

OLD_IFS=$IFS            # Save current Input File Separtor (IFS)
declare -a Arr          # Array for YAD Window input
NumCPU=$(nproc --all)   # Number of CPUs (nproc from coreutils)

### Error Message Functions ###

Abend () {
    # Abnormal Ending - Parameter 1 = message to display, Parameter 2=exit code

    yad --image "dialog-error" --image-on-top --title "$TITLE - Fatal Error" 
        "$GEOMETRY" --button=gtk-ok:0 --text "$1" 2>/dev/null
    exit "$2"
   
} # Abend

ErrMsg () {
    # Parmater 1 = message to display

    yad --image "dialog-error" --title "$TITLE - Logical Error" 
        "$GEOMETRY" --button=gtk-ok:0 --text "$1" 2>/dev/null

    fErrMsgForceContinue=true
 
} # ErrMsg

### Initialize Variables ###

InitVars () {

    [[ ! -e "$ALLOW_MIN_FREQ" ]] && Abend "$ALLOW_MIN_FREQ not found" 11
    AllowMinFreq=$(cat "$ALLOW_MIN_FREQ")
    AllowMinFreq="${AllowMinFreq::-3}"  # Chop off three decimals at end

    [[ ! -e "$ALLOW_MAX_FREQ" ]] && Abend "$ALLOW_MAX_FREQ not found" 12
    AllowMaxFreq=$(cat "$ALLOW_MAX_FREQ")
    AllowMaxFreq="${AllowMaxFreq::-3}"

    [[ ! -e "$CURR_MIN_FREQ" ]] && Abend "$CURR_MIN_FREQ not found" 13
    CurrMinFreq=$(cat "$CURR_MIN_FREQ")
    CurrMinFreq="${CurrMinFreq::-3}"
    NewMinFreq="$CurrMinFreq"

    [[ ! -e "$CURR_MAX_FREQ" ]] && Abend "$CURR_MAX_FREQ not found" 14
    CurrMaxFreq=$(cat "$CURR_MAX_FREQ")
    CurrMaxFreq="${CurrMaxFreq::-3}"
    NewMaxFreq="$CurrMaxFreq"

    if [[ -e "$PSTATE_DIR" ]] ; then
        NumPstates=$(cat "$PSTATE_DIR/num_pstates")
        if [[ $(cat "$PSTATE_DIR/no_turbo") -eq 0 ]] ; then
            TurboBoost="Enabled"
        else
            TurboBoost="Disabled"
        fi
    else
        NumPstates="Not found"
        TurboBoost="Not found"
    fi

    if [[ -e "$CPU0_DIR/scaling_governor" ]] ; then
        Governor=$(cat "$CPU0_DIR/scaling_governor")
    else
        Governor="Not found"
    fi

    if [[ -e "$CPU0_DIR/scaling_cur_freq" ]] ; then
        CurrFreq=$(cat "$CPU0_DIR/scaling_cur_freq")
        # Chop off three decimals at end
        CurrFreq="${CurrFreq::-3}"
    else
        CurrFreq="Not found"
    fi

} # InitVars

### Paint / repaint window and get new frequencies ###

GetParameters () {

    # +------------------------------------------+
    # |  cpuf - Set CPU Min/Max Frequencies      |
    # +------------------------------------------+
    # |                                          |
    # |  Turbo Boost:            Enabled         |
    # |                                          |
    # |  Number of pstates:      99              |
    # |  Speed Governor Used:    powersave       |
    # |  Current CPU0 frequency: 9999 Mhz        |
    # |                                          |
    # |  Current Minimum Freq.:  9999 Mhz        |
    # |  Current Maximum Freq.:  9999 Mhz        |
    # |                                          |
    # |  New Minimum Frequency   9999            |
    # |  New Maximum Frequency   9999            |
    # |                                          |
    # +------------------------------------------+

    IFS="|"
    Arr=($(yad "$GEOMETRY" --form 
        --title "$TITLE" --text "$TEXT" 
        --window-icon="$ICON" --image="$ICON" 
        --field="Turbo Boost:":RO "$TurboBoost" 
        --field="Number of pstates:":RO "$NumPstates" 
        --field="Speed Governor:":RO "$Governor" 
        --field="Current Frequency:":RO "$CurrFreq MHz" 
        --field="Allowable Minimum Frequency:":RO "$AllowMinFreq MHz" 
        --field="Allowable Maximum Frequency:":RO "$AllowMaxFreq MHz" 
        --field="Current Minimum Frequency:":RO "$CurrMinFreq MHz" 
        --field="Current Maximum Frequency:":RO "$CurrMaxFreq MHz" 
        --field="New Minimum Frequency" "$NewMinFreq" 
        --field="New Maximum Frequency" "$NewMaxFreq" 2>/dev/null))

    Return="$?"
    NewMinFreq="${Arr[8]}"
    NewMaxFreq="${Arr[9]}"

} # GetParameters

###################################
#            MAINLINE             #
###################################

ALL_PREFIX="/sys/devices/system/cpu/cpu"
MIN_SUFFIX="/cpufreq/scaling_min_freq"
MAX_SUFFIX="/cpufreq/scaling_max_freq"

while true ; do

    InitVars
    GetParameters
    [[ ! "$Return" -eq 0 ]] && break ; # Exit on Cancel=1 or Close Window=252

    # Sanity checks
    fErrMsgForceContinue=false
    [[ $NewMinFreq -lt $AllowMinFreq ]] && ErrMsg "Minimum frequency too low"
    [[ $NewMaxFreq -gt $AllowMaxFreq ]] && ErrMsg "Maximum frequency too high"
    [[ $NewMinFreq -gt $NewMaxFreq ]]   && ErrMsg "Minimum frequency greater than Maximum Frequency"
    [[ $fErrMsgForceContinue == true ]] && continue
    
    # Set new Min/Max frequencies
    for (( i=0 ; i<NumCPU ; i++ )) ; do
        # If New Min > Curr Max, set Max first then Min
        if [[ $NewMinFreq -gt $CurrMaxFreq ]] ; then
            echo "$NewMaxFreq""000" > "$ALL_PREFIX$i$MAX_SUFFIX"
            echo "$NewMinFreq""000" > "$ALL_PREFIX$i$MIN_SUFFIX"
        else
            echo "$NewMinFreq""000" > "$ALL_PREFIX$i$MIN_SUFFIX"
            echo "$NewMaxFreq""000" > "$ALL_PREFIX$i$MAX_SUFFIX"
        fi
    done
    

done

IFS="$OLD_IFS"
exit 0

Ubuntu
  1. Ein einfaches BASH-Skript für die Ubuntu-Server-Nachinstallation

  2. Warum erkennt das Bash-Skript keine Aliase?

  3. Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner?

  4. Bash Echo Die Befehlszeile wird in der Befehlszeile selbst ausgeführt (nicht in einem Skript)?

  5. Wie stoppe ich das Loop Bash-Skript im Terminal?

So führen Sie ein Bash-Skript aus {7 Methoden}

So zeigen Sie GUI-Dialoge in Bash-Skripten mit Zenity an

Eine einfache Möglichkeit, den IOStat-Befehl zu verstehen

CPU ist kostenlos, aber Bash-Skript nutzt nicht alle CPU-Ressourcen?

Beim Erstellen des ersten Bash-Skripts kann der Cd-Befehl nicht „hängen“ bleiben?

Installieren von Programmen aus dem Bash-Skript?