เรียกใช้สคริปต์เมื่อเชื่อมต่อจอภาพแล้ว


13

ฉันพยายามเรียกใช้สคริปต์ที่ตั้งอยู่usr/local/bin/เมื่อฉันเชื่อมต่อจอภาพภายนอกกับแล็ปท็อปของฉัน ฉันพยายามเพิ่มudevกฎใหม่แต่ไม่ได้ผล ฉันสร้างไฟล์ใหม่ในที่เรียกว่า/etc/udev/rules.d vga-monitor-connect.rulesเนื้อหาของไฟล์คือ

SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/panel-fix"

ฉันเอาสายจากคำตอบนี้

หลังจากค้นหาออนไลน์ฉันก็ลองทำตามกฎต่อไปนี้

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/rumesh/.Xauthority", RUN+="/usr/local/bin/panel-fix"

อย่างไรก็ตามสิ่งนี้ไม่ได้ผลเช่นกัน

ฉันรันสคริปต์ด้วยตนเองและฉันสามารถยืนยันได้ว่ามันทำงานได้ดังนั้นจึงไม่มีปัญหากับสคริปต์ของฉัน

ฉันต้องการทำให้ชัดเจนว่าฉันไม่ทราบมากนักudevดังนั้นกฎที่ฉันใช้อาจผิด หากใครรู้กฎที่เหมาะสมสำหรับปัญหาของฉันโปรดทิ้งคำตอบไว้

กราฟิกการ์ดของฉันคือชิปเซ็ต Intel GM965 ในตัว


คุณต้องการทำแบบนี้โดยเฉพาะหรือไม่? สคริปต์พื้นหลังเล็ก ๆ น่าจะเป็นเค้กชิ้นหนึ่ง
Jacob Vlijm

@JacobVlijm สคริปต์จะเป็นอย่างไร คุณช่วยแสดงตัวอย่างได้ไหม
Rumesh

มันเป็นเพียงเพื่อทริกเกอร์ถ้ามีการติดตั้งจอภาพที่สอง (?)?
Jacob Vlijm

ใช่ฉันต้องเรียกใช้สคริปต์ของตัวเองเมื่อฉันแนบจอภาพที่สอง
Rumesh

1
ไม่มีปัญหาใช้เวลาของคุณและตอบเมื่อคุณสามารถ :)
30915 Rumesh

คำตอบ:


7

วิธีอื่นในการเรียกใช้คำสั่งหากหน้าจอเชื่อมต่อหรือตัดการเชื่อมต่อ

ทางเลือกอื่นคือการเรียกใช้สคริปต์พื้นหลังเล็ก ๆ การรันสคริปต์ด้านล่างในพื้นหลังฉันไม่สามารถวัดการเพิ่มขึ้นของตัวประมวลผลใด ๆ

มันเป็นวิธีที่สะดวกในการเรียกใช้สคริปต์หรือคำสั่งอื่น ๆ เมื่อใดก็ตามที่หน้าจอที่สองเชื่อมต่อหรือตัดการเชื่อมต่อ

สคริปต์ตัวอย่าง

  • เพียงตรวจสอบทุกห้าวินาทีจำนวนครั้งที่ "เชื่อมต่อ" เกิดขึ้นในเอาต์พุตของคำสั่งxrandr(คำนึงถึงช่องว่างหลังจาก "เชื่อมต่อ" เพื่อป้องกันการจับคู่ที่ผิดพลาดด้วย "ตัดการเชื่อมต่อ") แต่ละเหตุการณ์แสดงถึงหน้าจอที่เชื่อมต่อ
  • หากจำนวนการเปลี่ยนแปลงที่เกิดขึ้นแสดงว่าหน้าจอถูกเชื่อมต่อหรือตัดการเชื่อมต่อ การเปลี่ยนแปลงคือ "สังเกต" โดยสคริปต์และสามารถเชื่อมต่อกับคำสั่งคุณสามารถตั้งค่าในส่วนหัวของสคริปต์

บท

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

วิธีใช้

  1. คัดลอกสคริปต์ลงในไฟล์เปล่าบันทึกเป็น connect_screen.py
  2. ในส่วนหัวตั้งคำสั่งให้ทำงานในการเชื่อมต่อ (ฉันตั้ง "gedit" เป็นตัวอย่างใจคำพูด) นอกจากนี้ยังเป็นไปได้ที่จะตั้งค่าคำสั่งให้ตัดการเชื่อมต่อเช่นเดียวกัน ปล่อยให้disconnect_command = ""มันเป็นอย่างอื่น

    หากคุณใช้คำสั่งตัดการเชื่อมต่อให้ยกเลิกการใส่เครื่องหมายในบรรทัดด้วย:

    run_command(disconnect_command)

    และแสดงความคิดเห็นในบรรทัด:

    pass

    ตามที่ระบุในสคริปต์

  3. ทดสอบสคริปต์จากเทอร์มินัลเชื่อมต่อหน้าจอของคุณและดูว่าทั้งหมดทำงานได้ดีหรือไม่
  4. หากทำงานได้ดีให้เพิ่มลงในแอปพลิเคชันเริ่มต้นของคุณ: Dash> แอปพลิเคชันเริ่มต้น> เพิ่มคำสั่ง:

    /bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"

    sleep 15คือการทำให้สก์ท็อปเริ่มต้นขึ้นก่อนที่จะสคริปต์เริ่มทำงาน เพียงเพื่อให้แน่ใจ


แก้ไข

วิธีการเรียกใช้สคริปต์ในการเริ่มต้นในทาง "สมาร์ท"

การหยุดพักของsleep 15ควรทำงานโดยทั่วไป แต่เนื่องจากเวลาเริ่มต้นแตกต่างกันไปตามแต่ละระบบอาจต้องใช้เวลาในการทดสอบเพื่อหาเวลาพักที่เหมาะสม ด้วยการเพิ่มขนาดเล็กสคริปต์จะกลายเป็น "สมาร์ท" และรอให้xrandrคำสั่งประสบความสำเร็จก่อนที่จะเริ่มสคริปต์จริง หากคุณใช้รุ่นด้านล่างคุณจะต้องเพิ่มคำสั่งเท่านั้น:

python3 /path/to/connect_screen.py

ในแอปพลิเคชันเริ่มต้นของคุณ การใช้งานเพิ่มเติมนั้นเหมือนกับเวอร์ชั่นด้านบนทั้งหมด

บท

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

4
คุณกำลังให้จักรยานกับผู้ชายที่มีรถที่หักเร็วแทนที่จะซ่อมรถ ...
solsTiCe

1
@solsTiCe 1. นี่ไม่ใช่จักรยาน แต่เป็นตัวเลือกที่ใช้งานได้อย่างสมบูรณ์แบบ โปรดจำไว้ว่าทุกการกระทำ notify-, เลี้ยงที่นี่เราหรือสิ่งที่ขับเคลื่อนอยู่ของการทำงานชนิดของห่วงบางอย่างใด 2. ฉันขอแนะนำให้คุณแก้ไข Ferrari แล้ว
Jacob Vlijm

1
@Rumesh ทำงานสคริปต์ใน$PATH กับไฟล์นามสกุลและที่มีก่อนหน้านี้ภาษาเป็นวิธีการแก้ปัญหาที่ไม่ให้สง่างาม คำถามคือถ้าคุณต้องการเรียกใช้สำหรับผู้ใช้หนึ่งคนหรือสำหรับผู้ใช้ทั้งหมด ในกรณีสุดท้ายจำเป็นต้องมีการตั้งค่าอื่นนอกเหนือจากที่แนะนำ แต่ไม่ควรเป็นการตั้งค่าที่คุณแนะนำ :) sleep 15อาจจะไม่เพียงพอ แต่เป็นทางออกที่สง่างามมากขึ้นอาจจะทำให้หยุดพัก "สมาร์ท" ให้ลองสคริปต์ / ยกเว้นที่จะเริ่มต้นจนถึงขั้นตอนการเริ่มต้นคือ "พร้อม" สคริปต์เพื่อให้การทำงาน จะเป็นนอกจากนี้เล็กน้อย แจ้งให้เราทราบ
Jacob Vlijm

1
สคริปต์ @Rumesh ใน$PATHไม่ควรมีนามสกุลภาษาและจะปฏิบัติการเรียกใช้โดยไม่ต้องpython3เห็นlintian.debian.org/tags/script-with-language-extension.html
จาค็อบ Vlijm

1
@JacobVlijm ฉันได้ตั้งค่าให้สามารถเรียกใช้งานได้ก่อนหน้านี้ดังนั้นฉันเดาว่าฉันสามารถใช้งานได้connect_screen
Rumesh

2

ซึ่งสามารถทำได้จากการติดตามสคริปต์ทุบตีเช่นกัน

#!/usr/bin/env bash

xrandr=$(xrandr)

con_monitors=$(echo $xrandr | grep -c " connected ")

    if [[ $con_monitors -gt 1 ]]; then
        # All the layouts are saved in "screenlayout" folder.
        # eg cmd. xrandr --output HDMI-1 --mode 2560x1440 --pos 0x0 --rotate normal --output DP-1 --off --output eDP-1 --primary --mode 1920x1080 --pos 283x1440 --rotate normal --output DP-2 --off
        for layout in ~/.screenlayout/*.sh; do
            ./layout
        done
    fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.