xrandr 命令未在从 udev 规则调用的 shell 命令中执行

lab*_*ito 6 ubuntu udev xrandr

我拥有一个带有 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==""
Run Code Online (Sandbox Code Playgroud)

然后,我创建了一个 udev 规则:

$ cat /etc/udev/rules.d/99-docking.rules
KERNEL=="dock.0", ATTR{docked}=="1", RUN+="/usr/local/sbin/dock.sh"
Run Code Online (Sandbox Code Playgroud)

脚本/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
Run Code Online (Sandbox Code Playgroud)

两个回显命令的执行都没有任何问题。此外,在手动调用脚本时,分辨率设置正确。我做错了什么?

Gil*_*il' 8

xrandr被执行,但失败。你应该阅读它的错误信息,他们会告诉你出了什么问题。您可以将脚本的所有输出放在日志文件中,只需在该#!行之后添加以下行:

exec >/home/hoppe/udev.out 2>&1
Run Code Online (Sandbox Code Playgroud)

你会发现消息是:

Can't open display 
Run Code Online (Sandbox Code Playgroud)

像任何其他 X 程序一样,xrandr与由DISPLAY环境变量指示的 X 服务器对话。您需要告诉它要与哪个显示器对话。在任何时候,您都可能有多个 X 服务器在运行,一些与硬件通信,一些远程显示(例如VNC),一些没有任何可见的显示(例如xvfb)等。 查找哪些 X 显示器连接到特定硬件并不容易,但在实践中,只需假设:0已连接到硬件,而所有其他都未连接。所以把它放在你的脚本中:

export DISPLAY=:0
Run Code Online (Sandbox Code Playgroud)

解决DISPLAY问题后,您需要授权该脚本访问您的显示。即使脚本以 root 身份运行,这也不是自动的,因为 X 是网络透明的:必须只允许本地 root 访问本地显示,并且没有特殊机制,通常的cookie机制也适用于 root . 这在我可以以 root 身份在另一个用户的桌面上启动图形程序吗?.

  • 非常感谢。您的最后一个链接确实解决了问题。我只需将以下内容添加到dock.sh 的行中: export XAUTHORITY=/home/$USERNAME/.Xauthority export DISPLAY=:0 (4认同)