Как грубое решение, вы можете опросить sysfs. На моем ноутбуке у меня есть:
$ cat /sys/class/drm/card0-LVDS-1/status
connected
$ cat /sys/class/drm/card0-VGA-1/status
disconnected
Я предполагаю, что для этого требуется ядро DRM и, возможно, KMS.
Чтобы увидеть, можете ли вы запускать что-то автоматически, вы можете запустить udevadm monitor --property
и наблюдать, пока вы (не) подключаете монитор, чтобы увидеть, сообщаются ли события.
С моим Radeon я получаю событие при первом подключении монитора VGA, но никаких событий при последующих отключениях и повторных подключениях не происходит. Событие должно выглядеть примерно так (используя ваш пример):
KERNEL[1303765357.560848] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV_LOG=0
ACTION=change
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
SUBSYSTEM=drm
HOTPLUG=1
DEVNAME=dri/card0
DEVTYPE=drm_minor
SEQNUM=2943
MAJOR=226
MINOR=0
К сожалению, сравнивать особо не с чем, но пока на картинке только одна видеокарта, что не так уж важно. Найдите, откуда udev получает правила в вашей системе (вероятно, /etc/udev/rules.d/
), и создайте файл 99-monitor-hotplug.rules
с:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/root/hotplug.sh"
udev
будет тогда запускаться hotplug.sh
, когда дисплей подключен. В качестве теста я поместил в /root/hotplug.sh
следующее (не забудьте сделать этот скрипт исполняемым):
#!/bin/sh
for output in DVI-I-1 LVDS-1 VGA-1; do
echo $output >> /root/hotplug.log
cat /sys/class/drm/card0-$output/status >> /root/hotplug.log
done
После этого я получил запись в hotplug.log
после подключения внешнего дисплея. Даже при фильтрации по ACTION=="change"
у меня все еще есть некоторые события при загрузке, так что вы можете как-то учесть это в своем скрипте.