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",我仍然会在启动时获得一些事件,因此您可能希望在脚本中以某种方式考虑这一点.
另一个答案在正确的道路上:您想从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)
也可以看看: