Mit tegyünk ha filmezés közben alvó állapotba kerül a gépünk Linux Minten?

A válasz egyszerű! Írjunk egy bash szkriptet! Sokat gondolkodtam, mire végül rájöttem arra, hogy filmezés közben legjobb a processzor (CPU) terhelését mérni és ha a terhelés magasabb egy átlagos nyugalmi állapotban levő CPU terhelési értékétől, akkor a bash szkript 1 pixellel elmozdítja az egeret, majd visszaállítja, ezzel újraindítva az X grafikai szerver nyugalmi állapot számlálóját, ami méri, hogy mennyi idő maradt a számítógép alvó állapotba való helyezéséig (ugyanez igaz a monitor kikapcsolására is, hibernációra, azaz az Energiakezelő opciójaira).

Sajnos a bash nem tud parancsokat küldeni az X szervernek (amin az Xfce, MATE, Cinnamon felület is fut), ezért a következő csomagot kell telepíteni

sudo apt install xautomation

Ez a csomag tartalmazza az xte parancsot, ami szimulálni tudja az egér és a billentyűzet műveleteket. Így pl. meg tudjuk mozdítani az egeret egy pixelnyire:

xte 'mousermove 1 1'

Majd visszaállítani:

xte 'mousermove -1 -1'

Wayland-en nem hiszem, hogy működnek a fenti parancsok.

A CPU terhelésének kiszámítását nem taglalom részletesen, mert ez benne van a bash szkriptben, csak annyit, hogy a /proc/stat adatai alapján minden másodpercben kiszámolja a szkript a CPU terhelését és ezen értékek 1 perces átlagát ezrelékekben, majd ha a ez az érték magasabb egy megadott alapértéknél akkor megmozdítja az egérmutatót.

A cat /proc/stat a következőket adja:

cpu  7757438 883 1432948 10899182 7618 0 237391 0 0 0
cpu0 1954763 246 343614 10608611 7474 0 88845 0 0 0
cpu1 1975930 210 312963 97441 25 0 66092 0 0 0
cpu2 1824151 193 435734 96054 69 0 37003 0 0 0
cpu3 2002593 232 340637 97075 48 0 45450 0 0 0
...

A bash szkript csak az első (cpu) sor összesített cpu magok adataival számol.

Tapasztalat útján arra jöttem rá, hogy ezrelékekben könnyebb számolni és precízebb CPU terhelési adatokat kapok, elkerülve ezzel a lebegőpontos (nem egész, tört számokkal) való műveleteket.

Továbbá meghatároztam, hogy a saját gépemen a CPU nyugalmi állapotának a terhelése átlagosan 15 ezrelék percenként, azaz 1,5%. Ennek dupláját, tehát 30 ezreléket használok mint határértéket a bash szkriptben, mert egy egyszerű offline zenelejátszás a háttérben nem eredményez kevesebb mint 40 ezrelékes CPU terhelést. Az offline/online rádiózás, zenehallgatás, filmezés, letöltések, fájl másolások, frissítések és egyéb intenzív folyamatok garantáltan meghaladják a CPU 30 ezrelékes leterhelését percenkénti átlagban.

Végső soron mindenki határozza meg a saját gépén levő Linuxon a CPU nyugalmi állapotának terhelését az alábbi bash szkript segítségével, majd változtasson a határértéken. A szkript kiírja a percenkénti átlagos terhelést ezrelékekben.

Majd ha a határérték meg van állapítva és ennek megfelelően módosítva a szkript, akkor egy tetszőleges nevű, pl. cputerh.sh fájlban kell elmenteni az alábbi bash szkriptet, majd sudo chmod +x ~/cputerh.sh. A fájlnak a felhasználó gyökérkönyvtárában (~)  kell lennie, mert ott található a .bashrc amit megnyitunk, majd hozzáadjuk a végén a következő sort, elmentjük, hogy automatikusan fusson a bash szkriptünk rendszerindításkor a háttérben a szöveges kimenetének átirányításával a semmibe (null).

. ~/cputerh.sh >/dev/null &

Hogy fut-e a szkriptünk, megnézhetjük a jobs paranccsal, ami az alábbi választ kell hogy kiírja:

[1]+  Running                 . ~/cputerh.sh > /dev/null &

Végül is az alábbiakban található a teljes bash szkript, kommentekkel ellátva:

#!/bin/bash

#A másodperc számlálót 0-ra állítjuk
sleep_time=0
#Egy végtelen  While-do (Ameddig valami, csináld) ciklust indítunk
while :; do
  # Get the first line with aggregate of all CPUs
  # Vegyük a /proc/stat táblázatának első vonalát, ami a CPU teljes terhelését mutatja
  cpu_now=($(head -n1 /proc/stat))
  # Get all columns but skip the first (which is the "cpu" string)
  # Vegyük az összes oszlopot, de átugorjuk az elsőt, mert az nem tartalmaz adatot
  cpu_sum="${cpu_now[@]:1}"
  # Replace the column seperator (space) with +
  # Az oszlop elválasztó üres helyeket + jellel helyettesítjük (összeadjuk az értékeket)
  cpu_sum=$((${cpu_sum// /+}))
  # Get the delta between two reads
  #Vegyük a kettő leolvasott CPU terhelési érték különbségét (mostani mínusz előző)
  cpu_delta=$((cpu_sum - cpu_last_sum))
  # Get the idle time Delta
  # Vegyük a CPU kettő leolvasott nyugalmi értékének különbségét (mostani mínusz előző)
  cpu_idle=$((cpu_now[4]- cpu_last[4]))
  # Calc time spent working
  # Kiszámoljuk a CPU munkaidejét
  cpu_used=$((cpu_delta - cpu_idle))
  # Calc percentage
  # Kiszámoljuk a CPU terhelését százalékban
  cpu_usage=$((100 * cpu_used / cpu_delta))

  # Keep this as last for our next read
  # A jelenleg kiszámolt értékeket megvigyázzuk a következő ciklusra mint régi értékek
  cpu_last=("${cpu_now[@]}")
  cpu_last_sum=$cpu_sum

#Az alábbi kikommentelt vonal kiírja másodpercenként a CPU terhelését százalékban ha a # jelet eltávolítjuk
#  echo -n " CPU $cpu_usage%"

# Minden kiszámolt CPU terhelési százalékot összeadunk és tárolunk 1 percig
  cpu_all=$((cpu_all + cpu_usage))
#Ha a lefutott ciklusok száma elérte az 59-et, azaz 1 percet akkor:
  if [ $sleep_time = 59 ]; then
#Kiszámoljuk a CPU 1 perces terhelési átlagát ezrelékekben és kiírjuk az echo paranccsal
    cpu_avg=$((10 * cpu_all / sleep_time))
    echo -n " -> 1perces CPU terhelési átlag: $cpu_avg‰ |"
#Ha a terhelési átlag nagyobb 30 ezreléknél (HATÁRÉRTÉK!), megmozgatjuk az egeret 1 pixellel, majd visszaállítjuk    
     if [ $cpu_avg -ge 30 ]; then
    xte 'mousermove 1 1'
    xte 'mousermove -1 -1'
    echo "egérmozgás"
     fi
#Nullára állítjuk az alábbi értékeket az újabb ciklusra
        sleep_time=0
    cpu_all=0
  fi
  # Wait a second before the next read
  #Várunk 1 másodpercet
  sleep 1
  #Összeadjuk a másodperceket
  sleep_time=$((sleep_time + 1))
#Itt a ciklus vége, indulhatunk újra
done

Remélem hasznosnak bizonyul ez a kis szkript és ha van benne hiba, nyugodtan lehet írni és javítom. Jó kisérletezést!

Hozzászólások

Cinnamon

Értékelés: 

5
Átlag: 5 (2 szavazat)

Cinnamon alatt nem megy alvóba a gép, képernyővédő sem indul, ha videós alkalmazás fut. Legalábbis VLC, meg OBS studio futtatásakor tuti. Egyik általam telepített gépen sem.

csuhas32 képe

Caffeine-indicator

Értékelés: 

5
Átlag: 5 (3 szavazat)

Én a Caffeine-indicator-t szoktam elindítani és aktiválni, ha arra van szükségem, hogy ne induljon el a képernyővédő, ne zároljon a fiók és kapcsoljon ki a kijelző. Deaktiválni is kézzel kell, ez is igaz, de nekem azért megfelel.

Cinnamon

Értékelés: 

5
Átlag: 5 (1 szavazat)

#1 Nálam sajnos Linux Mint 20-as Xfce felületen, 5.4 LTS kernelel alvó állapotba megy a Lenovo Ideapad IAP320-as gépem filmnézés közben. Valami ACPI gond lehet, mert bootoláskor valamit kiír, de lényegtelen, mert ezzel a bash szkripttel megoldottam.