我有一个带有intel图形的eeepc。我想将一个脚本挂钩到通过VGA插入监视器的事件。怎么做?
答案 0 :(得分:28)
作为原始解决方案,您可以在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"
进行过滤,我仍然会在启动时收到一些事件,因此您可能希望在脚本中以某种方式考虑这一点。
答案 1 :(得分:4)
您有三种选择:
change
uevent。在上述任何一种方式中,你仍然需要以这种或那种方式进行投票,所以我只选择第一种选择。
答案 2 :(得分:4)
This other answer在正确的道路上:您想听udev
中的DRM事件。
I've implemented a Python script,当(取消)插入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()
另请参阅:
答案 3 :(得分:3)
谢谢sebastianwagner!
有了这些信息,我已经能够在关闭电视的情况下成功启动我的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似乎工作正常。
答案 4 :(得分:2)
假设您正在运行X,脚本可以解析xrandr的输出以查看连接的监视器。这适用于任何图形卡。这是您可能用来使用脚本中的更改的相同工具。
它无法解决自动运行脚本的通知问题。虽然我没有很好的通用解决方案,但常见的情况是检测外部显示器何时存在,因为笔记本电脑连接到扩展坞。在这种情况下,您可以让脚本触发连接到扩展坞时触发的其他内容,例如添加或删除USB键盘或以太网。