루트로서의 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

좋아,의 DISPLAY앞에는 bash지금 작동하는 것 같습니다. 감사!
Martin Ueding

큰! 어쨌든 내 who했다 0.0. 그것이 효과가 있기 때문에 나는 그 DISPLAY부분을 ​​답으로 추가 할 것이다 . 받아주세요. 감사!
ish

답변:


7
  • xrandr 는 일반적으로 DISPLAY환경 변수 를 통해 어떤 디스플레이를 말하는지 알아야 합니다.
  • root( udev로 실행되는) 기본 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.