O script para impedir o apagamento da tela usando o “movimento do mouse” não funciona

9

Esta é minha tentativa de criar um script que use um "movimento do mouse" para evitar que a tela fique em branco enquanto assisto a vídeos. Espero usar o valor para o maior processo de% de CPU tope, se o uso da CPU exceder 5%, um movimento do mouse deve ocorrer.

#!/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

Infelizmente isso não funciona. Os erros são assim:

[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 ")

Como faço para corrigir isso? (Observe que não tenho experiência em scripts.)


Com base nas respostas aqui, reuni:

#!/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

Então, relatei esse código nos Fóruns do Ubuntu e o Vaphell trabalhou mais nele. Abaixo está a versão do Vaphell e é o que estou usando:

#!/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

fonte
para começar, -gtespera operandos inteiros, não ponto flutuante. e eu não sei por que você está usando ((... ))em vez de apenas [... ]. ou porque você está usando CPU% como o gatilho ... ou até mesmo por que você está extraindo a utilização da CPU% a partir de um programa de maldições como top em vez de algo comops -heo %C --sort -%cpu | head -1
cas
5
Na IMO, seria melhor descobrir por que o programa do seu player de vídeo não está desativando o protetor de tela e corrigindo isso. Qual jogador você usa? (por exemplo, totem, vlc, ...) e qual gerenciador de área de trabalho / janela (gnome, xfce, lxde, kde, outro) e qual protetor de tela.
cas
1
Sim, eu já tive problemas com o vlc / gnome antes. iirc, acabei usando xsetcomo sugerido por Raphael abaixo.
cas
4
Talvez mais do que um pouco relacionado: xkcd.com/196
DanteTheEgregore 18/13
3
Posso sugerir que você simplesmente instale um aplicativo para evitar que a tela fique em branco enquanto os vídeos estão em execução? Eu uso cafeína , que funciona muito bem mesmo.
Paddy Landau

Respostas:

5

Você tem alguns problemas: primeiro, você precisará de 2 iterações de topcada vez, veja minha resposta aqui e o relatório de erros aqui .

O outro problema é que o bash não faz ponto flutuante; portanto, se o uso da CPU for algo parecido 6.2, .2o script será interrompido. O Bash simplesmente não foi projetado para operações aritméticas "complexas". Uma maneira de contornar isso seria mover a >5verificação dentro do seu awkcomando:

#!/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
fonte
9

Você pode usar

xset -dpms; xset s off

para impedir que a tela fique preta.

Para habilitar isso novamente, use

xset +dpms; xset s on

Portanto, -dpmsdesativa os recursos de economia de energia, que podem desligar o monitor inteiro e s offo recurso de proteção de tela do servidor X.

Isso não funciona com o xscreensaver, mencionado nos comentários.

Raphael Ahrens
fonte
Isso não pressupõe que você está usando xscreensaver? Funcionará com algum protetor de tela? Mesmo os de DE gostam gnome-screensaver?
terdon
@terdon Tanto quanto sei, isso desativa todos os tipos de protetores de tela.
Raphael Ahrens
Eu quero algo que não precisa da minha intervenção
@ vasa1, desde que funcione para o seu protetor de tela, ele não precisa de mais intervenção do que o seu script. Você acabou de executar esse comando uma vez e o protetor de tela está desativado.
terdon
2
@ vasa1 você pode usar isso em vez de xdotool mousemove 0 100.
Raphael Ahrens
0

Primeiro, você precisa instalar o xdotool & rand. Exemplo no Ubuntu:

sudo apt install xdotool rand

Em seguida, execute este one-liner em um terminal (como usuário):

eval $(xdotool getdisplaygeometry --shell); while true; do xdotool mousemove `rand -M $WIDTH` `rand -M $HEIGHT` && sleep $((`rand -M 300` + 120)); done;
Pivert
fonte