为外部显示器添加 udev 规则

Posted

技术标签:

【中文标题】为外部显示器添加 udev 规则【英文标题】:add udev rule for external display 【发布时间】:2012-09-28 17:43:50 【问题描述】:

我编写了一个小 shell 脚本,用 xrandr 配置附加的外部显示器。

# cat /home/didi/bin/monitor_autoswitcher.sh 
#!/bin/bash

xrandr | grep "HDMI1 connected"
if [[ $? == 0 ]]; then
  # is connected
  xrandr --output HDMI1 --right-of LVDS1 --auto
else
  # not connected
  xrandr --output HDMI1 --auto
fi

xrandr | grep "VGA1 connected"
if [[ $? == 0 ]]; then
  # is connected
  xrandr --output VGA1 --right-of LVDS1 --auto
else
  # not connected
  xrandr --output VGA1 --auto
fi

这行得通。现在我想让它自动触发,发现这可以用 udev 完成。 我试过了

udevadm monitor

当插入外部显示器输出时

KERNEL[465828.240250] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV  [465828.243549] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)

以及拔掉电源时

KERNEL[465836.844209] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV  [465836.847445] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)

也不错。

然后我添加了一个udev规则:

# cat 40-external-display.rules 
SUBSYSTEM=="drm", ACTION=="change", RUN+="/home/didi/bin/monitor_autoswitcher.sh"

然后重启udev

service udev restart

不幸的是,插入/拔出显示器时仍然没有任何反应。脚本monitor_autoswitcher.sh 绝对有效,因为在插入后手动调用它就可以了。

缺少什么?

【问题讨论】:

【参考方案1】:

这看起来几乎是一样的。我看到的唯一真正区别是脚本设置了 DISPLAY 变量,这可能是关键。

http://ruedigergad.com/2012/01/28/hotplug-an-external-screen-to-your-laptop-on-linux/

【讨论】:

丢失了一半。还需要:XAUTHORITY 环境变量,请参阅unix.stackexchange.com/questions/14854/…。我认为你的答案是正确的,因为它把我带到了正确的轨道上。 在我的例子中,XAuthority 变量在设置为~/.XAuthority 时不起作用。必须将其设置为/run/user/1000/gdm/Xauthority

以上是关于为外部显示器添加 udev 规则的主要内容,如果未能解决你的问题,请参考以下文章

在Linux中插上U盘,是怎么识别和挂载U盘的,Linux底层里发生了啥变化!急急急!

外部图形和属性规则的 Geoserver SLD 样式问题

从 udev 规则文件向 shell 脚本传递参数

udev规则以及编写

udev规则以及编写

Cluster基础:配置iSCSI服务编写udev规则配置并访问NFS共享部署Multipath多路径环境