xrandr 作为 root 无法找到显示

xrandr 作为 root 无法找到显示

当我停靠或取消停靠我的 ThinkPad 时,我有以下规则调用我的脚本:

# /lib/udev/rules.d/81-thinkpad-dock.rules
KERNEL=="dock.0", ATTR{docked}=="0", RUN+="/usr/bin/think-dock-hook off"
KERNEL=="dock.0", ATTR{docked}=="1", RUN+="/usr/bin/think-dock-hook on"

这就是将被调用的脚本:

# /usr/bin/think-dock-hook
# Find the user who is currently logged in on the primary screen.
user="$(who -u | grep -F '(:0)' | head -n 1 | awk '{print $1}')"
su -c "bash -x /usr/bin/think-dock $setto" "$user" >> /root/think-dock.log 2>&1 &

然后调用的脚本会做一些事情xrandr

问题是我可以think-dock on以我的用户身份运行(mu),并且它可以正常工作。我可以sudo -i运行,think-dock-hook on并且它也可以正常工作。但是当我让它udev运行它时,它只会收到以下错误xrandr

# output of bash -x think-dock on
+ xrandr --output LVDS1 --auto
Can't open display

现在如果我xrandr从我的sudo -ishell 调用,我会得到:

No protocol specified
No protocol specified
Can't open display :0

但是,如果我su -c xrandr mu从我的sudo -ishell 执行此操作,我会得到预期的输出。

所以我不太明白,调用的脚本udev失败了。

答案1

  • 兰德需要知道你正在谈论哪个显示器,通常通过DISPLAY环境变量
  • root(哪个udev运行方式)没有DISPLAY设置默认值;即使设置了,su -c也不会默认保留环境
  • 因此,将其明确地传递给 bash,这样应该可以解决您的问题,例如:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    

相关内容