作为根的xrandr找不到显示


9

当我停靠或取消停靠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

现在,如果我xrandrsudo -i外壳调用,我将得到:

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

但是,如果su -c xrandr musudo -i外壳程序执行操作,则将获得预期的输出。

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


1
grep -F '(:0)'应该是grep -F '(:0.0)'; 也尽量坚持一个DISPLAY=:0.0在前面/usr/bin/think-dock
ISH

DISPLAY似乎不错。我的who显示(:0)虽然。因此,我认为grep不会更好。
马丁·乌丁

好的,DISPLAY位于前面的bash似乎现在可以正常工作。谢谢!
马丁·乌丁

大!我who0.0,但无论如何。既然可以了,我将添加该DISPLAY部分作为答案。请接受。谢谢!
ish 2012年

Answers:


7
  • xrandr需要知道您正在谈论哪个显示,通常是通过DISPLAY环境变量
  • rootudev运行时使用)没有默认DISPLAY设置;即使他/她做到了,su -c也不会默认保留环境
  • 因此,将其显式传递给bash,这应该可以解决您的问题,例如:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.