xrandr là root không thể tìm thấy màn hình


9

Tôi có quy tắc sau gọi kịch bản của mình khi tôi neo hoặc hủy gắn ThinkPad của mình:

# /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"

Đó là kịch bản sẽ được gọi là:

# /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 &

Và kịch bản sau đó được gọi là làm một cái gì đó với xrandr.

Điều này là tôi có thể chạy think-dock onnhư người dùng của tôi ( mu) và nó hoạt động. Tôi có thể sudo -ivà chạy think-dock-hook onvà nó hoạt động quá. Nhưng khi tôi udevchạy nó, nó sẽ nhận được lỗi sau xrandr:

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

Bây giờ nếu tôi gọi xrandrtừ sudo -ivỏ của mình , tôi nhận được:

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

Tuy nhiên, nếu tôi làm su -c xrandr mutừ sudo -ivỏ của mình , tôi sẽ nhận được đầu ra mong đợi.

Vì vậy, tôi không thực sự hiểu, kịch bản được gọi từ udevthất bại.


1
grep -F '(:0)'nên được grep -F '(:0.0)'; cũng thử dán một cái DISPLAY=:0.0trước mặt/usr/bin/think-dock
ish

Điều đó DISPLAYcó vẻ tốt. whoMàn hình của tôi (:0)mặc dù. Vì vậy, tôi không nghĩ rằng grep sẽ tốt hơn theo cách đó.
Martin Uting

Được rồi, với DISPLAYphía trước bash, nó dường như làm việc bây giờ. Cảm ơn!
Martin Uting

Tuyệt quá! Của tôi whođã có 0.0, nhưng dù sao. Vì nó hoạt động, tôi sẽ thêm DISPLAYphần dưới dạng câu trả lời; làm ơn chấp nhận nó. Cảm ơn!
ish

Câu trả lời:


7
  • xrandr cần biết bạn đang nói về màn hình nào, thông qua DISPLAYbiến môi trường
  • root(mà udev chạy như) không có DISPLAYbộ mặc định ; ngay cả khi anh ấy / cô ấy đã làm, su -ckhông bảo vệ môi trường theo mặc định
  • Vì vậy, vượt qua nó một cách rõ ràng để bash, và điều đó sẽ giải quyết vấn đề của bạn, ví dụ:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.