Script untuk mencegah pengosongan layar menggunakan "mouse move" tidak berfungsi


9

Ini adalah usaha saya untuk membuat skrip yang akan menggunakan "gerakan mouse" untuk mencegah pengosongan layar saat menonton video. Saya berharap untuk menggunakan nilai untuk proses CPU% tertinggi topdan jika penggunaan CPU melebihi 5%, perpindahan mouse harus terjadi.

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

Sayangnya, itu tidak berhasil. Kesalahannya seperti ini:

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

Bagaimana cara saya memperbaikinya? (Harap perhatikan bahwa saya tidak berpengalaman dalam skrip.)


Berdasarkan jawaban di sini, saya mengumpulkan:

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

Kemudian, saya melaporkan kode ini di Forum Ubuntu dan Vaphell mengerjakannya lebih lanjut. Di bawah ini adalah versi Vaphell dan apa yang saya gunakan:

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

untuk mulai dengan, -gtmengharapkan operan integer, bukan floating point. dan saya tidak yakin mengapa Anda menggunakan ((... ))bukan hanya [... ]. atau mengapa Anda menggunakan CPU% sebagai pemicunya ... atau bahkan mengapa Anda mengekstraksi utilisasi CPU% dari program kutukan seperti atas daripada sesuatu sepertips -heo %C --sort -%cpu | head -1
cas

5
IMO, Anda akan lebih baik mencari tahu mengapa program pemutar video Anda tidak menonaktifkan screensaver dan memperbaikinya. Pemain mana yang Anda gunakan? (mis. totem, vlc, ...) dan desktop / window-manager apa (gnome, xfce, lxde, kde, lainnya) dan screen saver mana.
cas

1
ya, saya pernah mengalami masalah vlc / gnome sebelumnya. iirc, saya akhirnya menggunakan xsetseperti yang disarankan oleh Raphael di bawah ini.
cas

4
Mungkin lebih dari sedikit terkait: xkcd.com/196
DanteTheEgregore

3
Bolehkah saya menyarankan Anda menginstal aplikasi untuk mencegah pengosongan layar saat video sedang berjalan? Saya menggunakan Kafein , yang bekerja dengan sangat baik.
Paddy Landau

Jawaban:


5

Anda memiliki beberapa masalah, pertama, Anda akan membutuhkan 2 iterasi topsetiap kali, lihat jawaban saya di sini dan laporan bug di sini .

Masalah lainnya adalah bahwa bash tidak melakukan floating point, jadi jika penggunaan CPU Anda adalah sesuatu seperti 6.2, .2akan merusak skrip. Bash sama sekali tidak dirancang untuk operasi aritmatika 'kompleks'. Salah satu caranya adalah dengan memindahkan >5cek di dalam awkperintah Anda :

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

Kamu bisa menggunakan

xset -dpms; xset s off

untuk menghentikan layar agar tidak hitam.

Untuk mengaktifkannya lagi gunakan

xset +dpms; xset s on

Jadi -dpmsmenonaktifkan fitur hemat energi daya, yang dapat mematikan seluruh monitor dan s offmematikan fitur screen saver dari X server.

Ini tidak bekerja dengan xscreensaver, yang disebutkan dalam komentar.


Bukankah itu menganggap Anda menggunakan xscreensaver? Apakah ini akan bekerja dengan screensaver apa saja ? Bahkan yang DE suka gnome-screensaver?
terdon

@terdon Sejauh yang saya tahu ini menonaktifkan semua jenis screensaver.
Raphael Ahrens

Saya menginginkan sesuatu yang tidak memerlukan intervensi saya

@ vasa1 selama ini berfungsi untuk screensaver Anda, itu tidak memerlukan intervensi lebih dari skrip Anda. Anda cukup menjalankan perintah itu sekali dan screensaver tidak aktif.
terdon

2
@ vasa1 Anda bisa menggunakan ini alih-alih xdotool mousemove 0 100.
Raphael Ahrens

0

Pertama, Anda perlu menginstal xdotool & rand. Contoh di Ubuntu:

sudo apt install xdotool rand

Kemudian jalankan one-liner ini di terminal (sebagai pengguna):

eval $(xdotool getdisplaygeometry --shell); while true; do xdotool mousemove `rand -M $WIDTH` `rand -M $HEIGHT` && sleep $((`rand -M 300` + 120)); done;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.