Запуск сценария при подключении монитора

11

Я пытаюсь запустить скрипт, расположенный в 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

    
задан Rumesh 30.05.2015 в 10:29
источник

1 ответ

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 = "" , как есть.

    Если вы используете команду 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
    
ответ дан Jacob Vlijm 30.05.2015 в 18:11
источник