ルートとしての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

シェルxrandrから呼び出すとsudo -i、次のようになります。

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

ただし、シェルsu -c xrandr muから実行sudo -iすると、期待どおりの出力が得られます。

だから私は本当に理解していません、から呼び出されたスクリプトはudev失敗します。


1
grep -F '(:0)'する必要がありgrep -F '(:0.0)'ます。のDISPLAY=:0.0前にも貼り付けてみてください/usr/bin/think-dock
ish

それはDISPLAY良いようです。私のwhoディスプレイ(:0)も。したがって、grepがそのように優れているとは思いません。
Martin Ueding、2012

さて、のDISPLAY前でbash、今は動作しているようです。ありがとう!
Martin Ueding、2012

すごい!私whoは持っていましたが0.0、とにかく。うまくいったので、そのDISPLAY部分を答えとして追加します。受け入れてください。ありがとう!
ish

回答:


7
  • xrandrは、通常はDISPLAY環境変数を介して、どのディスプレイについて話しているかを知る必要があります
  • rootudevの実行方法)にはデフォルトのDISPLAYセットはありません。彼/彼女がそうしたとしても、su -cデフォルトでは環境を保存しません
  • したがって、明示的にbashに渡すと、問題が解決するはずです。例:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.