lightdm
正在运行 X 服务器。如何找出$DISPLAY
它正在听哪个设置?
背景:我正在调试显示器和 GPU(专有nvidia
驱动程序)之间的 DPMS 问题,它们通常可以很好地配合使用,除非它们不能正常工作(显示器闲置几个小时后不会从待机状态唤醒) )。xset dpms force o{ff,n}
很有用,但只有当我知道$DISPLAY
我在做什么时。当图形会话正在运行时,这没有问题(通常只是:0
),但 lightdm 似乎并不遵守此约定,并且DISPLAY=:0
来自 tty 或 ssh 的欺骗会返回unable to open display ":0"
错误。
答案1
事实证明我也有同样的问题(使用 DPMS 甚至纯屏消隐、专有的 NVidia 驱动程序、lightdm,而且还来自登录的会话),我刚刚找到了一个解决方案:
从 Xorg 复制 xauth 文件,以便您可以读取它,将 XAUTHORITY 变量设置为指向该文件,并将显示设置为 Xauth 文件中找到的显示(在我的例子中为 unix:0)。
完整运行:
~ $ ssh somecomputer
~ $ ps ax | grep lightdm
40420 ? SLsl 0:00 /usr/sbin/lightdm
62985 tty7 Ssl+ 0:00 /usr/lib/xorg/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
63075 ? Sl 0:00 lightdm --session-child 18 21
63192 ? Ssl 0:00 /usr/sbin/lightdm-gtk-greeter
63240 ? S 0:00 lightdm --session-child 14 21
67141 pts/0 S+ 0:00 grep lightdm
~ $ sudo su
~ # cp /var/run/lightdm/root/:0 /tmp/lightdmauth
~ # chmod a+r /tmp/lightdmauth
~ # exit
~ $ export XAUTHORITY=/tmp/lightdmauth
~ $ xauth -f /tmp/lightdmauth
xauth: /tmp/lightdmauth not writable, changes will be ignored
Using authority file /tmp/lightdmauth
xauth> list
somecomputer/unix:0 MIT-MAGIC-COOKIE-1 5b35f44220224bef134a491dc3bxxxxx
xauth> exit
~ $ export DISPLAY=unix:0
~ $ xeyes &
xeyes 出现在 lightdm 上。
此文档来自 Citrix帮助过我。
现在我仍然需要找到如何设置它以自动唤醒屏幕。我的想法(经过测试并且有效)是运行 sxhkd 向 lightdm 添加键盘快捷键,以运行我们制作的自定义脚本,使显示恢复正常(下面作为奖励提供)。
~ $ cat /usr/local/bin/fix-black-screen
#!/bin/bash
##
# fix_black_screen
# Tries to wake up screen if disconnected due to deep sleep
if [ -n "$1" ]; then
ssh "$1" $(basename $0)
exit $?
fi
# get the list of plugged-in monitors, regardless of whether they are connected
# or disconnected.
# When not showing in nvidia-settings, it looks like this in xrandr:
# DP-3 disconnected 2560x1440+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
# When showing in in nvidia-settings as disabled, it looks like this in xrandr:
# DP-3 connected 2560x1440+0+0 (normal left inverted right x axis y axis) 600mm x 340mm
export DISPLAY=:0
outputs="`xrandr | grep 'connected' | cut -d ' ' -f 1`"
for attempt in {1..10}; do
for output in $outputs ; do
# we only try to re-enable the display if it shows as connected
xrandr --current | grep -q "^$output connected"
if [ "$?" -eq 1 ]; then
echo "Output $output does not show as connected, will retry later ($attempt/10)."
continue
fi
xrandr --output $output --preferred --dpi 96
xdotool mousemove 0 0
xrandr -q | grep -q "*"
if [ $? -eq 0 ]; then
echo "Fixed output $output"
break
fi
done
sleep 1
done
xset -dpms
xset dpms 600 1200 0