这是我尝试制作一个脚本,该脚本将使用“鼠标移动”来防止观看视频时屏幕空白。我希望使用最高 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 论坛上报告了这段代码,瓦佩尔对此进行了进一步的研究。以下是 Vapell 的版本,也是我正在使用的版本:
#!/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
答案1
您可以使用
xset -dpms; xset s off
阻止屏幕变黑。
要再次启用此功能,请使用
xset +dpms; xset s on
因此-dpms
禁用电源节能功能,可以关闭整个显示器并s off
关闭X服务器的屏幕保护功能。
这不适用于xscreensaver
评论中提到的 。
答案2
你有几个问题,首先,你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
答案3
首先,您需要安装 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;