![xrandr 命令未在从 udev 规则调用的 shell 命令中执行](https://linux22.com/image/2291/xrandr%20%E5%91%BD%E4%BB%A4%E6%9C%AA%E5%9C%A8%E4%BB%8E%20udev%20%E8%A7%84%E5%88%99%E8%B0%83%E7%94%A8%E7%9A%84%20shell%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E6%89%A7%E8%A1%8C.png)
我拥有一台带有 UltraBase(扩展坞)的 Thinkpad。我的操作系统是Ubuntu 10.10。现在,我想通过正确设置外部显示器的分辨率来对“对接”事件做出反应。这是我已经完成的:
$ udevadm info -a -p /sys/devices/platform/dock.0
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/platform/dock.0':
KERNEL=="dock.0"
SUBSYSTEM=="platform"
DRIVER==""
ATTR{modalias}=="platform:dock"
ATTR{docked}=="0"
ATTR{flags}=="16"
ATTR{uid}=="0"
ATTR{type}=="dock_station"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
然后,我创建了一个 udev 规则:
$ cat /etc/udev/rules.d/99-docking.rules
KERNEL=="dock.0", ATTR{docked}=="1", RUN+="/usr/local/sbin/dock.sh"
脚本/usr/local/sbin/dock.sh如下:
#!/bin/sh
# turn external display on, internal off
echo "hello world" >> "/home/hoppe/udev.out"
/usr/bin/xrandr --output LVDS1 --off
/usr/bin/xrandr --output DP2 --mode "1920x1080"
echo "hello world" >> "/home/hoppe/udev.out"
exit
两个 echo 命令都执行没有任何问题。此外,在手动调用脚本时,分辨率设置正确。我做错了什么?
答案1
xrandr
已执行,但失败。您应该阅读它的错误消息,它们会告诉您出了什么问题。您可以将脚本的所有输出放入日志文件中,只需在该#!
行后面添加以下行即可:
exec >/home/hoppe/udev.out 2>&1
你会发现消息是:
Can't open display
与任何其他 X 程序一样,与环境变量xrandr
指示的 X 服务器进行通信DISPLAY
。您需要告诉它要与哪个显示器交谈。在任何时候,您都可能有多个 X 服务器正在运行,其中一些与硬件通信,一些远程显示(例如虚拟网络控制器),有些没有任何可见的显示(例如xvfb)等。查找哪些 X 显示器连接到特定硬件并不容易,但在实践中,只需假设该显示器:0
已连接到硬件,而所有其他显示器均未连接到硬件。因此,将其放入您的脚本中:
export DISPLAY=:0
解决问题后DISPLAY
,您需要授权该脚本访问您的显示器。即使脚本以 root 身份运行,这也不是自动的,因为 X 是网络透明的:必须只允许本地 root 访问本地显示,并且没有特殊的机制,通常是曲奇饼机制也适用于 root。这涵盖在我可以以 root 身份在另一个用户的桌面上启动图形程序吗?。