使用“鼠标移动”来防止屏幕变黑的脚本不起作用


9

这是我尝试制作一个脚本,该脚本将使用“鼠标移动”来防止在观看视频时出现屏幕空白。我希望将值用于最高CPU%进程,top并且如果CPU使用率超过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%作为触发器...或者甚至为什么要从诸如top之类的curses程序中提取CPU%的使用率,而不是类似的原因ps -heo %C --sort -%cpu | head -1
cas 2013年

5
IMO,您最好找出为什么您的视频播放器程序未禁用屏幕保护程序并进行修复。您使用哪个播放器?(例如图腾,vlc等)以及什么桌面/窗口管理器(gnome,xfce,lxde,kde等)以及哪个屏幕保护程序。
cas 2013年

1
是的,我之前遇到过vlc / gnome问题。iirc,我最终xset按照下面Raphael的建议使用。
cas 2013年

4
也许不止相关:xkcd.com/196
DanteTheEgregore

3
我是否建议您仅安装一个应用程序以防止在视频运行时出现屏幕空白?我使用咖啡因,效果确实很好。
帕迪·兰道

Answers:


5

您有几个问题,首先,top每次都需要2次迭代,请在此处查看我的答案并在此处查看错误报告。

另一个问题是bash不会执行浮点运算,因此,如果您的CPU使用率类似于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

@terdon据我所知,这会禁用所有类型的屏保。
拉斐尔·阿伦斯

我想要一些不需要我干预的东西

@ vasa1,只要这对您的屏幕保护程序有效,它不需要脚本的更多干预。您只需运行该命令一次,屏幕保护程序就会关闭。
terdon

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.