Cara alternatif untuk menjalankan perintah jika layar terhubung atau terputus
Solusi alternatif adalah menjalankan skrip latar belakang kecil. Menjalankan skrip di bawah ini di latar belakang, saya tidak bisa mengukur peningkatan beban prosesor apa pun.
Ini adalah cara mudah yang mudah untuk menjalankan skrip, atau perintah lainnya, setiap kali layar kedua terhubung atau terputus.
Contoh skrip
- Cukup periksa setiap lima detik berapa kali string "terhubung" muncul dalam output perintah
xrandr
(ingat ruang setelah "terhubung" untuk mencegah kecocokan salah dengan "terputus"). Setiap kejadian mewakili layar yang terhubung.
- Jika jumlah kemunculan berubah, layar dapat dihubungkan atau diputus. Perubahan "diperhatikan" oleh skrip dan dapat dihubungkan ke perintah, Anda dapat mengatur di bagian kepala skrip.
Naskah
#!/usr/bin/env python3
import subprocess
import time
#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])
# first count
xr1 = None
while True:
time.sleep(5)
# second count
xr2 = count_screens(get(["xrandr"]))
# check if there is a change in the screen state
if xr2 != xr1:
print("change")
if xr2 == 2:
# command to run if connected (two screens)
run_command(connect_command)
elif xr2 == 1:
# command to run if disconnected (one screen)
# uncomment run_command(disconnect_command) to enable, then also comment out pass
pass
# run_command(disconnect_command)
# set the second count as initial state for the next loop
xr1 = xr2
Cara Penggunaan
- Salin skrip ke file kosong, simpan sebagai
connect_screen.py
Di bagian kepala, setel perintah untuk dijalankan pada koneksi (saya set "gedit" sebagai contoh, ingat tanda kutip). Juga dimungkinkan untuk mengatur perintah pada disconnect. Lain pergi disconnect_command = ""
seperti itu.
Jika Anda menggunakan perintah disconnect-, batalkan komentar pada baris:
run_command(disconnect_command)
dan berikan komentar:
pass
Seperti yang ditunjukkan dalam skrip
- Uji-coba skrip dari terminal, sambungkan layar Anda dan lihat apakah semuanya berfungsi dengan baik.
Jika semua berfungsi dengan baik, tambahkan ke aplikasi startup Anda: Dash> Aplikasi Startup> Tambahkan perintah:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
Ini sleep 15
adalah untuk membuat desktop memulai sepenuhnya sebelum skrip mulai berjalan. Hanya untuk memastikan.
EDIT
Cara menjalankan skrip saat memulai dengan cara "pintar".
Waktu istirahat sleep 15
seharusnya bekerja secara umum, tetapi karena waktu start up berbeda per sistem, Mungkin perlu beberapa percobaan untuk menemukan waktu istirahat yang tepat. Dengan tambahan kecil, skrip menjadi "pintar", dan menunggu xrandr
perintah untuk berhasil sebelum memulai skrip yang sebenarnya. Jika Anda menggunakan versi di bawah ini, Anda hanya perlu menambahkan perintah:
python3 /path/to/connect_screen.py
ke Aplikasi Startup Anda. Penggunaan lebih lanjut persis sama dengan versi di atas.
Naskah
#!/usr/bin/env python3
import subprocess
import time
#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---
while True:
time.sleep(5)
try:
subprocess.Popen(["xrandr"])
except:
pass
else:
break
# function to get the output of xrandr
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])
# first count
xr1 = None
while True:
time.sleep(5)
# second count
xr2 = count_screens(get(["xrandr"]))
# check if there is a change in the screen state
if xr2 != xr1:
if xr2 == 2:
# command to run if connected (two screens)
run_command(connect_command)
elif xr2 == 1:
# command to run if disconnected (one screen)
# uncomment run_command(disconnect_command) to enable, then also comment out pass
pass
# run_command(disconnect_command)
# set the second count as initial state for the next loop
xr1 = xr2