สคริปต์เพื่อป้องกันการว่างหน้าจอโดยใช้“ การเลื่อนเมาส์” ไม่ทำงาน


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 Forums และ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% จากโปรแกรมคำสาปเช่นส่วนบนแทนที่จะเป็นแบบอื่นps -heo %C --sort -%cpu | head -1
cas

5
IMO คุณควรที่จะรู้ว่าทำไมโปรแกรมเครื่องเล่นวิดีโอของคุณจึงไม่ปิดการใช้งานโปรแกรมรักษาหน้าจอและแก้ไขสิ่งนั้น คุณใช้เครื่องเล่นอะไร (เช่น totem, vlc, ... ) และเดสก์ท็อป / window-manager (gnome, xfce, lxde, kde, อื่น ๆ ) และโปรแกรมรักษาหน้าจอใด
cas

1
ใช่ฉันเคยพบปัญหา vlc / gnome มาก่อน iirc, ฉันลงเอยด้วยการใช้xsetตามที่แนะนำโดย Raphael ด้านล่าง
cas

4
อาจเกี่ยวข้องกับบิตมากกว่านี้: xkcd.com/196
DanteTheEgregore

3
ฉันขอแนะนำให้คุณติดตั้งแอปพลิเคชันเพื่อป้องกันหน้าจอว่างเปล่าขณะที่วิดีโอกำลังทำงานอยู่ได้ไหม ฉันใช้คาเฟอีนซึ่งทำงานได้ดีมากแน่นอน
Paddy Landau

คำตอบ:


5

คุณมีสองประเด็นแรกคุณจะต้องใช้เวลา 2 ซ้ำtopแต่ละครั้งดูคำตอบของฉันที่นี่และรายงานข้อผิดพลาดที่นี่

อีกปัญหาคือ bash นั้นไม่ได้ทำ floating point ดังนั้นหากการใช้งาน CPU ของคุณเป็นอย่าง6.2นั้น.2จะทำให้ script แตก 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? มันจะทำงานร่วมกับสกรีนเซฟเวอร์ใด ๆ ? แม้แต่คนที่ชอบgnome-screensaver?
terdon

@terdon เท่าที่ฉันรู้ว่าสิ่งนี้ปิดการใช้งานสกรีนเซฟเวอร์ทุกประเภท
Raphael Ahrens

ฉันต้องการบางสิ่งที่ไม่ต้องการการแทรกแซงของฉัน

@ vasa1 ตราบใดที่มันใช้งานได้กับสกรีนเซฟเวอร์ของคุณมันก็ไม่ต้องการการแทรกแซงใด ๆ นอกจากสคริปต์ของคุณ คุณเพียงแค่เรียกใช้คำสั่งนั้นครั้งเดียวและสกรีนเซฟเวอร์ปิด
terdon

2
@ vasa1 xdotool mousemove 0 100คุณสามารถใช้วิธีนี้แทน
Raphael Ahrens

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.