如何在intel图形上为"monitor plugged"创建回调?

Rea*_*onk 25 linux intel udev xorg

我有一个带有intel图形的eeepc.我想将一个脚本挂钩到通过VGA插入监视器的事件.怎么做?

And*_*ndy 28

作为原始解决方案,您可以在sysfs上进行轮询.我的笔记本电脑上有:

$ cat /sys/class/drm/card0-LVDS-1/status
connected

$ cat /sys/class/drm/card0-VGA-1/status
disconnected
Run Code Online (Sandbox Code Playgroud)

我猜这需要内核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
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有太多东西要匹配,但只要图片中只有一张显卡不太重要.找到udev在您的系统上获取规则的地方(可能/etc/udev/rules.d/),并创建一个99-monitor-hotplug.rules文件:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/root/hotplug.sh"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

有了这个,我在hotplug.log连接外部显示器后得到了一个条目.即使过滤ACTION=="change",我仍然会在启动时获得一些事件,因此您可能希望在脚本中以某种方式考虑这一点.

  • 谢谢安迪这个!我创建了一个受这篇文章启发的脚本.您可以通过https://github.com/codingtony/udev-monitor-hotplug获取它.它在插入/拔出时使用xrandr来打开和关闭显示器.我希望它会有所帮助. (4认同)

Den*_*aia 5

另一个答案在正确的道路上:您想从udev.

我已经实现了一个 Python 脚本,它在 USB 设备或外部显示器被(拔出)插入时运行一些代码。我在下面包含了该脚本的最小版本(未经测试):

#!/usr/bin/env python3
import pyudev

def udev_event_received(device):
    ...  # Your code here!

context = pyudev.Context()
monitor_drm = pyudev.Monitor.from_netlink(context)
monitor_drm.filter_by(subsystem='drm')
observer_drm = pyudev.MonitorObserver(monitor_drm, callback=udev_event_received, daemon=False)

observer_drm.start()

# This will prevent the program from finishing:
observer_drm.join()
Run Code Online (Sandbox Code Playgroud)

也可以看看: