我有一台带有英特尔显卡的eeepc,我想将一个脚本挂钩到通过VGA连接的监视器插入事件上。该如何做呢?
作为一种粗略的解决方案,您可以在sysfs上进行轮询。在我的笔记本电脑上,我有:
$ cat /sys/class/drm/card0-LVDS-1/status
connected
$ cat /sys/class/drm/card0-VGA-1/status
disconnected
我猜这需要内核DRM和可能的KMS支持。udevadm monitor --property
命令,并在(断开)连接显示器时观察以查看是否报告了事件。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"
,在启动时仍会收到一些事件,因此您可能需要在脚本中考虑这一点。
99
是从哪里来的? - Foobarudev
监听DRM事件。
我已经实现了一个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()
另请参阅:
change
uevent。inotify
和netlink
套接字都可以使用select()
等函数。您真的认为这是“轮询”吗? - Brian Cainsudo inotifywait -e modify -m --format '%:e %f' /sys/class/drm/something
。因此你的第二个选项是无效的。 - nicholas.alipaz感谢sebastianwagner的帮助!
通过这些信息,我现在可以成功地在电视关闭的情况下启动我的Kodi媒体中心了。当电视关闭时,Intel驱动程序不会设置模式,所以当我之后打开电视时屏幕上就是一片空白。
Kodi日志显示了以下内容:
WARNING: CXRandR::Query - output HDMI1 has no current mode, assuming disconnected
所以我在 /etc/udev/rules.d/99-monitor-hotplug.rules 中创建了以下行:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/sbin/hotplugtv.sh"
/usr/sbin/hotplugtv.sh的内容(我的X服务器以root身份运行):
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/root/.Xauthority
/bin/date 2>&1 >> /var/log/hotplugtv.log;
if [[ $(cat /sys/class/drm/card0-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
echo "TV connected!" >> /var/log/hotplugtv.log;
/bin/sleep 2s;
/usr/bin/xrandr --verbose --output HDMI1 --auto 2>&1 >> /var/log/hotplugtv.log;
else
echo "TV disconnected!" >> /var/log/hotplugtv.log;
fi
在您对脚本进行任何更改时,请不要忘记重新加载udev规则(这让我疯狂!):
udevadm control --reload-rules
请注意在Kodi中禁用任何屏幕保护程序,因为当您最终开启电视时,它们将永久激活。 另一方面,节能/ DPMS似乎工作正常。