모니터가 연결되면 스크립트 실행


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모르므로 내가 사용한 규칙이 잘못되었을 수 있음을 분명히하고 싶습니다 . 내 문제에 대한 올바른 규칙을 아는 사람이 있으면 답변을 남겨주십시오.

내 그래픽 카드는 인텔 GM965 통합 칩셋입니다


구체적으로 이렇게 하시겠습니까? 작은 배경 스크립트는 케이크 조각 일 것입니다.
Jacob Vlijm

@JacobVlijm 스크립트는 어떻습니까? 예를 보여 주시겠습니까?
Rumesh

두 번째 모니터가 연결된 경우에만 트리거됩니까?
Jacob Vlijm

네, 두 번째 모니터를 연결할 때 자체 스크립트를 실행해야합니다
Rumesh

1
문제 없습니다. 시간을
내시고

답변:


7

화면이 연결되거나 연결이 끊어진 경우 명령을 실행하는 다른 방법

대안적인 해결책은 작은 백그라운드 스크립트를 실행하는 것입니다. 백그라운드에서 아래 스크립트를 실행하면 프로세서로드가 증가했는지 측정 할 수 없었습니다.

두 번째 화면이 연결되거나 연결이 끊어 질 때마다 스크립트 나 다른 명령을 실행하는 편리한 방법입니다.

예제 스크립트

  • 명령 출력에서 ​​"connected"문자열이 몇 번 나오는지 5 초마다 점검합니다 ( "connected" xrandr뒤에 공백이 있으면 "disconnected"와 일치하지 않도록 방지). 각 발생은 연결된 화면을 나타냅니다.
  • 발생 수가 변경되면 화면이 연결되었거나 연결이 끊어진 것입니다. 변경 사항은 스크립트에 의해 "감지"되며 명령에 연결될 수 있으며 스크립트의 헤드 섹션에서 설정할 수 있습니다.

스크립트

#!/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. head 섹션에서 connect에서 실행되도록 명령을 설정합니다 (예를 들어 "gedit"를 따옴표로 묶었습니다). 또한 마찬가지로 연결 해제시 명령을 설정할 수 있습니다. 그렇지 않으면 그대로 둡니다 disconnect_command = "".

    disconnect- 명령을 사용하는 경우 다음 줄도 주석 해제하십시오.

    run_command(disconnect_command)

    라인을 주석 처리하십시오.

    pass

    스크립트에 표시된대로

  3. 터미널에서 스크립트를 테스트 실행하고 화면을 연결 한 후 모든 것이 제대로 작동하는지 확인하십시오.
  4. 모두 제대로 작동하면 시작 응용 프로그램에 추가하십시오 : Dash> Startup Applications> 명령 추가 :

    /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. 자전거는 아니지만 완벽하게 기능하는 옵션입니다. 어쨌든 어떤 종류의 루프를 실행 하는 모든 통지, 이벤트 또는 모든 구동 동작이 존재 한다는 것을 명심하십시오 . 2. 페라리를 고칠 것을 권합니다.
Jacob Vlijm

1
@Rumesh $PATH 파일 확장자로 스크립트를 실행 하며 이전 언어로 우아하지 않은 솔루션입니다. 문제는 한 사용자 또는 모든 사용자에 대해 실행하려는 경우입니다. 마지막 경우, 제안 된 것과 다른 설정이 필요하지만 제안하는 설정이 아닌 것이 좋습니다. :). 는 sleep 15충분하지 않을 수도 있지만, 더 우아한 해결책은 휴식 "스마트"할 수 있도록 스크립트 시도 / 시작 절차가 실행하는 스크립트의 "준비"가 될 때까지 시작 제외 할 수 있습니다. 사소한 추가해야합니다. 알려주세요.
Jacob Vlijm

1
@Rumesh 스크립트의 $PATH언어 확장 은 없어야하며 실행 가능해야합니다. lintian.debian.org/tags/script-with-language-extension.htmlpython3참조하십시오 .
Jacob Vlijm

1
@JacobVlijm 이미 실행 가능하도록 설정 했으므로 그냥 사용할 수있을 것 같습니다connect_screen
Rumesh

2

이것은 다음 bash 스크립트에서도 가능합니다.

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