GNU/Linux >> Belajar Linux >  >> Ubuntu

Gui Atau Skrip Bash Sederhana Untuk Mencekik CPU?

Saya memiliki masalah dengan Chuwi Hi10 Pro. Ini terjadi di Linux dan Windows.
Ketika kecerahan layar terlalu tinggi, atau CPU mencapai 100%, saat dicolokkan, baterai mulai terkuras. Ini adalah pengurasan yang sangat lambat menggunakan pengisi daya QC USB 3.0, tetapi saya ingin tablet tetap menyala 24/7 dengan cukup andal.

Saya ingin tahu apakah ada metode yang mudah, lebih disukai GUI atau skrip Bash sederhana, untuk mencekik CPU (manajemen daya) dan kembali ke mode kinerja tinggi.

Saya ingin menggunakannya untuk layanan seperti Kodi; pemutaran video mungkin tidak akan terganggu jika sedikit diperlambat.

Pertanyaan sampingan, selain info baterai, apakah ada cara untuk mengetahui ampere dan watt dari adaptor AC?

Jawaban Terbaik

cpuf – GUI Bash Sederhana untuk mengatur Frekuensi Min/Maksimum CPU

Demonstrasi

Dalam demo ini cpuf jendela di sebelah kiri dan conky informasi sistem ada di sisi kanan. Beginilah perkembangan demo:

  • Demo dimulai saat video youtube sudah berjalan
  • Frekuensi minimum/maks CPU default adalah 800 / 3500
  • Ganti min/maks CPU menjadi 800 / 800 dan penggunaan CPU melonjak hingga 20%
  • Ganti min/maks CPU menjadi 3500 / 3500 dan penggunaan CPU turun menjadi 10%
  • Demo berulang dan dimulai lagi

Dengan tiga monitor cpuf dapat muncul 10 kaki jauhnya, jadi gunakan parameter 1 --geometry opsi untuk meletakkannya di dekat conky :

sudo cpuf --geometry="450x450+4720+80" //eadn-wc01-5196795.nxedge.io/home/rick/Pictures/icons/cpu-intel-128.svg
  • Parameter 1 --geometry adalah Lebar Jendela x Tinggi + Offset Lebar + Offset Tinggi
  • Parameter 2 dapat berupa ikon Anda sendiri (dalam hal ini gambar CPU Intel) jika tidak, defaultnya adalah ikon komputer

cpuf Skrip bash

Bagian ini mengharuskan Anda untuk membuka terminal dengan Ctrl +Alt +T .

Cara menyiapkan

Agar berfungsi, cpuf skrip bash membutuhkan:

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

Ini paling mudah ketika Anda menempatkan cpuf skrip ke direktori milik root dalam jalur pencarian Anda. Misalnya:/usr/local/bin .

Untuk membuat cpuf script buka editor dengan sudo -H gedit /usr/local/bin/cpuf .

  • Sorot garis di bagian bawah
  • Klik kanan dan pilih “Salin”
  • Beralih kembali ke editor Anda
  • Klik kanan dan pilih “Tempel”
  • Dari menu editor pilih “Simpan” lalu “Keluar”

Jadikan skrip dapat dieksekusi dengan sudo chmod a+x /usr/local/bin/cpuf .

cpuf kode untuk disalin ke editor Anda

#!/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. Mengapa Skrip Bash Tidak Mengenal Alias?

  2. Bash Script Untuk Menghapus File Terlama Dari Folder A?

  3. Bagaimana Menghentikan Skrip Loop Bash Di Terminal?

  1. Bagaimana Cara Membuat Script Bash Untuk Mengubah Format Tanggal Dalam File Csv?

  2. Membuat Script Bash Pertama, Tidak Bisa Mendapatkan Perintah Cd Untuk 'menempel.'?

  3. Pipa ke/dari clipboard dalam skrip Bash

  1. Bash Echo Baris Perintah Dieksekusi Di Baris Perintah Itu Sendiri (bukan Dalam Script)?

  2. Jalankan perintah bash pada pipa jenkins

  3. Apa perbedaan antara menjalankan skrip Bash vs sumbernya?