Skrypt zapobiegający wygaszaniu ekranu za pomocą „ruchu myszy” nie działa

9

To jest moja próba stworzenia skryptu, który użyje „ruchu myszy”, aby zapobiec wygaszaniu ekranu podczas oglądania filmów. Mam nadzieję, że użyję wartości najwyższego procesora w%, topa jeśli użycie procesora przekroczy 5%, powinien nastąpić ruch myszy.

#!/usr/bin/env bash

sleep_period=60s 

while true; do
  if (( $(top -bn 1 | sed -nrs '8p' | awk '{ print $9 }') -gt 5 )); then 
    while (( $(top -bn 1 | sed -nrs '8p' | awk '{ print $9 }') -gt 5 )); do
      xdotool mousemove 0 100
      xdotool mousemove 0 50
      sleep ${sleep_period}
    done
  else
    sleep ${sleep_period}
  fi
done

Niestety nie działa. Błędy są następujące:

[07:20 PM] /bin $ noo.sh
/home/vasa1/bin/noo.sh: line 6: ((: 0.0 -gt 5 : syntax error: invalid arithmetic operator (error token is ".0 -gt 5 ")
/home/vasa1/bin/noo.sh: line 6: ((: 6.4 -gt 5 : syntax error: invalid arithmetic operator (error token is ".4 -gt 5 ")

Jak to naprawić? (Uwaga: nie mam doświadczenia w pisaniu skryptów).


Na podstawie odpowiedzi tutaj zestawiłem:

#!/usr/bin/env bash

sleep_period=5m 

while true; do
  if [[ $(top -bn 1 | sed -nrs '8p' | awk '{ print int($9) }') -gt 8 ]]; then 
    while [[ $(top -bn 1 | sed -nrs '8p' | awk '{ print int($9) }') -gt 8 ]]; do
      xset -dpms; xset s off
      xset +dpms; xset s on
      sleep ${sleep_period}
    done
  else
    sleep ${sleep_period}
  fi
done

Następnie zgłosiłem ten kod na forach Ubuntu i Vaphell dalej nad nim pracował. Poniżej znajduje się wersja Vaphell i używam jej:

#!/usr/bin/env bash

sleep_period=5m 

while true; do
  if top -bn 1 | awk 'NR==8 { exit !($9>8); }'; then
    xset -dpms; xset s off
    xset +dpms; xset s on
  fi
  sleep ${sleep_period}
done

źródło
na początek -gtoczekuje operandów całkowitoliczbowych, a nie zmiennoprzecinkowych. I nie jestem pewien, dlaczego używasz ((... ))a nie tylko [... ]. lub dlaczego używasz CPU% jako wyzwalacza ... lub nawet dlaczego wyodrębniasz wykorzystanie CPU% z programu przekleństw, takiego jak top, a nie coś w stylups -heo %C --sort -%cpu | head -1
cas
5
IMO, lepiej byłoby dowiedzieć się, dlaczego twój program do odtwarzania wideo nie wyłącza wygaszacza ekranu i nie naprawia tego. Z którego gracza korzystasz? (np. totem, vlc, ...) i jaki menedżer pulpitu / okna (gnome, xfce, lxde, kde, inne) i który wygaszacz ekranu.
cas
1
tak, wcześniej miałem problemy z VLC / GNOME. iirc, skończyło się na użyciu, xsetjak sugeruje Raphael poniżej.
cas
4
Być może więcej niż trochę związane: xkcd.com/196
DanteTheEgregore
3
Czy mogę zasugerować, aby po prostu zainstalować aplikację, aby zapobiec wygaszaniu ekranu podczas odtwarzania filmów? Używam kofeiny , która naprawdę działa bardzo dobrze.
Paddy Landau

Odpowiedzi:

5

Masz kilka problemów, po pierwsze, będziesz potrzebować 2 iteracji za topkażdym razem, zobacz moją odpowiedź tutaj i raport o błędzie tutaj .

Innym problemem jest to, że bash nie robi liczb zmiennoprzecinkowych, więc jeśli użycie procesora jest podobne 6.2, .2spowoduje to uszkodzenie skryptu. Bash po prostu nie jest przeznaczony do „złożonych” operacji arytmetycznych. Jednym ze sposobów może być przesunięcie >5czeku wewnątrz awkpolecenia:

#!/usr/bin/env bash

sleep_period=60s 

while true; do
    until top -bn 2 -d 0.01 | sed -nrs '8p' | awk '{if($9>5){exit 1}else{exit 0}}'; do
      xdotool mousemove 0 100
      xdotool mousemove 0 50
      sleep ${sleep_period}
    done
   sleep ${sleep_period}
done
terdon
źródło
9

Możesz użyć

xset -dpms; xset s off

aby zatrzymać przyciemnianie ekranu.

Aby włączyć to ponownie, użyj

xset +dpms; xset s on

-dpmsWyłącza więc funkcje oszczędzania energii, które mogą wyłączyć cały monitor i s offwyłączyć funkcję wygaszacza ekranu serwera X.

To nie działa z xscreensaver, o którym wspomniano w komentarzach.

Raphael Ahrens
źródło
Czy to nie zakłada, że ​​używasz xscreensaver? Czy będzie działać z dowolnym wygaszaczem ekranu? Nawet DE takie jak gnome-screensaver?
terdon
@terdon O ile mi wiadomo, wyłącza wszystkie typy wygaszaczy ekranu.
Raphael Ahrens,
Chcę czegoś, co nie wymaga mojej interwencji
@ vasa1, o ile działa to w przypadku wygaszacza ekranu, nie wymaga więcej interwencji niż skrypt. Wystarczy uruchomić to polecenie raz, a wygaszacz ekranu zostanie wyłączony.
terdon
2
@ vasa1 możesz użyć tego zamiast xdotool mousemove 0 100.
Raphael Ahrens,
0

Najpierw musisz zainstalować xdotool & rand. Przykład na Ubuntu:

sudo apt install xdotool rand

Następnie uruchom ten jeden wiersz w terminalu (jako użytkownik):

eval $(xdotool getdisplaygeometry --shell); while true; do xdotool mousemove `rand -M $WIDTH` `rand -M $HEIGHT` && sleep $((`rand -M 300` + 120)); done;
Pivert
źródło