Скрипт для предотвращения гашения экрана с помощью «движения мыши» не работает


9

Это моя попытка создать скрипт, который будет использовать «движение мышью», чтобы предотвратить гашение экрана при просмотре видео. Я надеюсь использовать значение для максимального процесса CPU%, topи если загрузка процессора превышает 5%, должно произойти перемещение мыши.

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

К сожалению, это не работает. Ошибки такие:

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

Как я могу это исправить? (Обратите внимание, что у меня нет опыта в написании сценариев.)


Основываясь на ответах здесь, я собрал:

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

Затем я сообщил об этом коде на форумах Ubuntu, и Vaphell продолжил работу над ним. Ниже приведена версия Vaphell, которую я использую:

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

для начала -gtожидает целочисленные операнды, а не числа с плавающей запятой. и я не уверен , почему вы используете ((... ))а не просто [... ]. или почему вы используете CPU% в качестве триггера ... или даже почему вы извлекаете загрузку CPU% из программы curses типа top, а не чего-то вродеps -heo %C --sort -%cpu | head -1
cas

5
IMO, вам лучше узнать, почему ваша программа видеопроигрывателя не отключает заставку, а исправляет это. Каким игроком вы пользуетесь? (например, totem, vlc, ...) и какой рабочий стол / менеджер окон (gnome, xfce, lxde, kde, other) и какая заставка.
КАС

1
да, я сталкивался с проблемами vlc / gnome раньше. я закончил тем, что использовал xsetРафаэля ниже.
КАС

4
Возможно, более чем связано: xkcd.com/196
DanteTheEgregore

3
Могу ли я предложить вам просто установить приложение для предотвращения гашения экрана во время воспроизведения видео? Я использую кофеин , который действительно работает очень хорошо.
Пэдди Ландау

Ответы:


5

У вас есть пара вопросов, во-первых, вам понадобятся 2 итерации topкаждый раз, посмотрите мой ответ здесь и отчет об ошибке здесь .

Другая проблема заключается в том, что bash не выполняет операции с плавающей запятой, поэтому, если загрузка вашего процессора примерно такая 6.2, .2сценарий будет нарушен. Bash просто не предназначен для «сложных» арифметических операций. Один из способов обойти это - переместить >5проверку внутри вашей awkкоманды:

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

9

Ты можешь использовать

xset -dpms; xset s off

чтобы экран не стал черным.

Чтобы включить это снова используйте

xset +dpms; xset s on

Таким образом, -dpmsотключаются функции энергосбережения, которые могут отключить весь монитор и s offотключить функцию заставки X-сервера.

Это не работает с тем xscreensaver, что было упомянуто в комментариях.


Разве это не предполагает, что вы используете xscreensaver? Будет ли это работать с любой заставкой? Даже DE, как gnome-screensaver?
Тердон

@terdon Насколько я знаю, это отключает все типы заставок.
Рафаэль Аренс

Я хочу что-то, что не требует моего вмешательства

@ vasa1, пока это работает для вашего скринсейвера, оно не требует большего вмешательства, чем ваш скрипт. Вы просто запускаете эту команду один раз, и заставка выключена.
Тердон

2
@ vasa1 вы можете использовать это вместо xdotool mousemove 0 100.
Рафаэль Аренс

0

Сначала вам нужно установить xdotool & rand. Пример на Ubuntu:

sudo apt install xdotool rand

Затем запустите эту однострочную строку в терминале (как пользователь):

eval $(xdotool getdisplaygeometry --shell); while true; do xdotool mousemove `rand -M $WIDTH` `rand -M $HEIGHT` && sleep $((`rand -M 300` + 120)); done;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.