
這是我嘗試製作一個腳本,該腳本將使用“滑鼠移動”來防止觀看影片時螢幕空白。我希望使用最高 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;