我有一个 bash 脚本来检查用户身份验证,它将 DISPLAY 变量设置为:
export DISPLAY=:0.0
xhost +local:
系统启动后,在登录屏幕上,该脚本失败并出现错误:
xhost:无法打开显示“:0.0”
:无法连接到 X 服务器:0.0
登录后,相同的脚本可以运行,但没有任何错误。
那么,如何正确设置 DISPLAY 变量,还是我遗漏了其他内容?
答案1
当系统首次启动时,有时显示不可用,直到其他后台脚本完成运行。我的解决方案是在显示相关命令之前添加一个 sleep 命令,以便系统有时间完成加载。例如:
sleep 5 && export DISPLAY=:0.0 && xhost +local &
“&&”将命令串联起来,这样它们就会一个接一个地运行,并且只有前一个命令成功执行后,&& 后面的命令才会运行。末尾的“&”允许命令在后台运行,以便系统可以完成加载其必要的组件。如果末尾没有“&”,系统将不会继续加载,直到整行执行完毕,这就违背了包含该sleep
命令的目的。
答案2
这是我使用的等待用户登录的功能:
SpamLength=1
WaitForSignOn () {
# eyesome daemon is loaded during boot. The user name is required
# for xrandr external monitor brightness and gamma control. We must
# wait until user signs on to get .Xauthority file settings.
SpamOn=10 # Causes 10 iterations of 2 second sleep
SpamContext="Login"
TotalWait=0
[[ ! -f "$CurrentBrightnessFilename" ]] && rm -f \
"$CurrentBrightnessFilename"
# Wait for user to sign on then get Xserver access for xrandr calls
UserName=""
while [[ $UserName == "" ]]; do
sleep "$SpamLength"
TotalWait=$(( TotalWait + SpamLength ))
# Find UserName currently logged in.
UserName="$(who -u | grep -F '(:0)' | head -n 1 | awk '{print $1}')"
done
log "Waited $TotalWait seconds for $UserName to login."
xhost local:root
export XAUTHORITY="/home/$UserName/.Xauthority"
if [[ "$fUseDbusMonitor" == true ]] ; then
echo "$UserName" > "$EyesomeUser"
sync -d "$EyesomeUser" # Flush buffer immediately
fi
} # WaitForSignOn