LINUX.ORG.RU

Правило для udev (подключение монитора)

 , ,


0

3

Приветствую!

Хочу сделать так, чтобы при подключении монитора к ноутбуку, автоматически запускался скрипт, который бы настраивал расположение экранов так, как мне нужно. Как я понимаю, это можно реализовать при помощи правил udev.

В каталоге /etc/udev/rules.d я добавил файл 99-monitor-hotplug.rules со следующим содержимым:

 ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/home/viktor/scripts/monitor_plug.sh" 

Скрипт monitor_plug.sh содержит такой код:

#!/bin/bash

statusVGA="$(cat /sys/class/drm/card0-VGA-1/status)"
export XAUTHORITY=/home/viktor/.Xauthority
export DISPLAY=:0.0

if [ "${statusVGA}" = "connected" ]; then
        if [[ $(edid-decode /sys/class/drm/card0-VGA-1/edid | grep "Monitor name:" | sed 's/Monitor name: //') == "S22E200" ]]; then
                #/bin/sleep 2;
                xrandr --output LVDS-1-1 --off --output VGA-1-1 --primary --mode 1920x1080 --pos 0x0 --rotate normal --output HDMI-0 --off;
       fi
fi

Наверняка скрипт написан максимально криво, но суть в том, что при его запуске вручную, все работает как надо, но при подключении монитора ничего не происходит. Подскажите, пожалуйста, в чем может быть дело.


наверное ваш скрипт под рутом не работает

# /etc/udev/rules.d/95-monitor-hotplug.rules
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/stribog/.Xauthority", RUN+="/usr/bin/su stribog -c /home/stribog/bin/external-monitor"
Stribog ()
Последнее исправление: Stribog (всего исправлений: 1)

А скрипт твой точно запускается удевом и отрабатывает? Попробуй добавить в начало скрипта после шебанга что-то такое:

exec >>/tmp/script.log 2>&1
set -xu

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от ncrdg

Добавь в скрипт те две строчки и посмотри в /tmp/script.log после выполнения. Если в процессе выполнения какая-то из утилит выдала ошибку - это будет видно.

Deleted ()
Ответ на: комментарий от Deleted

Ага, посмотрел! Не знал, что это такой способ отладки. Обнаружилось две проблемы: 1. Имя монитора почему-то возвращается пустое (может быть потому что в edid на этот момент еще пусто?) 2. Появляется ошибка «xrandr: cannot find mode 1920x1080» (по той же причине, что и выше?)

Закомментил условие по имени монитора и убрал параметр "--mode", и оно заработало! Спасибо!

ncrdg ()