Một cách khác để chạy lệnh nếu màn hình được kết nối hoặc ngắt kết nối
Một giải pháp thay thế sẽ là chạy một kịch bản nền nhỏ. Chạy đoạn script bên dưới trong nền, tôi không thể đo bất kỳ sự gia tăng nào của tải bộ xử lý.
Đây là một cách dễ dàng để chạy tập lệnh hoặc bất kỳ lệnh nào khác, bất cứ khi nào màn hình thứ hai được kết nối hoặc ngắt kết nối.
Kịch bản ví dụ
- Chỉ cần kiểm tra cứ sau 5 giây số lần chuỗi "được kết nối" xuất hiện trong đầu ra của lệnh
xrandr
(lưu ý khoảng trắng sau khi "được kết nối" để ngăn kết quả khớp sai với "ngắt kết nối"). Mỗi lần xuất hiện đại diện cho một màn hình được kết nối.
- Nếu số lần xuất hiện thay đổi, một màn hình đã được kết nối hoặc ngắt kết nối. Thay đổi được "chú ý" bởi tập lệnh và có thể được kết nối với một lệnh, bạn có thể đặt trong phần đầu của tập lệnh.
Kịch bản
#!/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
Cách sử dụng
- Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng
connect_screen.py
Trong phần đầu, đặt lệnh để chạy trên kết nối (Tôi đặt "gedit" làm ví dụ, chú ý các trích dẫn). Ngoài ra, có thể thiết lập một lệnh trên ngắt kết nối, tương tự. Khác đi disconnect_command = ""
như nó là.
Nếu bạn sử dụng lệnh ngắt kết nối, đồng thời bỏ dòng:
run_command(disconnect_command)
và nhận xét ra dòng:
pass
Như được chỉ ra trong kịch bản
- Chạy thử tập lệnh từ thiết bị đầu cuối, kết nối màn hình của bạn và xem tất cả có hoạt động tốt không.
Nếu tất cả đều hoạt động tốt, hãy thêm nó vào các ứng dụng khởi động của bạn: Dash> Ứng dụng khởi động> Thêm lệnh:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
Các sleep 15
là làm cho máy tính để bàn khởi động hoàn toàn trước khi kịch bản bắt đầu chạy. Chỉ để chắc chắn.
BIÊN TẬP
Cách chạy tập lệnh khi khởi động theo cách "thông minh".
Việc nghỉ sleep 15
nên hoạt động chung, nhưng vì thời gian khởi động khác nhau trên mỗi hệ thống, nên có thể cần một số thử nghiệm để tìm thời gian nghỉ phù hợp. Với một bổ sung nhỏ, tập lệnh trở nên "thông minh" và chờ xrandr
lệnh thành công trước khi bắt đầu tập lệnh thực tế. Nếu bạn sử dụng phiên bản dưới đây, bạn chỉ cần thêm lệnh:
python3 /path/to/connect_screen.py
cho các ứng dụng khởi động của bạn. Sử dụng thêm là chính xác như phiên bản trên.
Kịch bản
#!/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