DISPLAY変数を次のように設定するユーザー認証をチェックするbashスクリプトがあります。
export DISPLAY=:0.0
xhost +local:
システムの起動後、ログイン画面でこのスクリプトは失敗し、エラーは次のようになります。
xhost:ディスプレイ ":0.0"を開けません
:Xサーバーに接続できません:0.
ログイン後、同じスクリプトが機能しますが、エラーは発生しません。
では、どのようにDISPLAY変数を適切に設定するか、または他に何か不足していますか?
システムが最初に起動するとき、他のバックグラウンドスクリプトの実行が完了するまで、ディスプレイを使用できない場合があります。私の解決策は、ディスプレイに関連するコマンドの前にスリープコマンドを追加して、システムに読み込みを完了する時間を与えることです。何かのようなもの:
sleep 5 && export DISPLAY=:0.0 && xhost +local &
'&&'は、コマンドが次々に実行されるようにコマンドをチェーンし、&&に続くコマンドは、前のコマンドが成功した場合にのみ実行されます。末尾の「&」は、システムが必要なコンポーネントのロードを完了できるように、コマンドをバックグラウンドで実行できるようにします。末尾に「&」がない場合、システムは、行全体が実行を完了するまでロードを続行しません。これにより、sleep
コマンドを含める目的が無効になります。
ユーザーがサインオンするのを待つ私が使用する関数は次のとおりです。
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