web-dev-qa-db-ja.com

Ubuntuのログイン画面でDISPLAY変数を取得するにはどうすればよいですか?

DISPLAY変数を次のように設定するユーザー認証をチェックするbashスクリプトがあります。

export DISPLAY=:0.0
xhost +local:

システムの起動後、ログイン画面でこのスクリプトは失敗し、エラーは次のようになります。

xhost:ディスプレイ ":0.0"を開けません
:Xサーバーに接続できません:0.

ログイン後、同じスクリプトが機能しますが、エラーは発生しません。
では、どのようにDISPLAY変数を適切に設定するか、または他に何か不足していますか?

1
abhi

システムが最初に起動するとき、他のバックグラウンドスクリプトの実行が完了するまで、ディスプレイを使用できない場合があります。私の解決策は、ディスプレイに関連するコマンドの前にスリープコマンドを追加して、システムに読み込みを完了する時間を与えることです。何かのようなもの:

sleep 5 && export DISPLAY=:0.0 && xhost +local &

'&&'は、コマンドが次々に実行されるようにコマンドをチェーンし、&&に続くコマンドは、前のコマンドが成功した場合にのみ実行されます。末尾の「&」は、システムが必要なコンポーネントのロードを完了できるように、コマンドをバックグラウンドで実行できるようにします。末尾に「&」がない場合、システムは、行全体が実行を完了するまでロードを続行しません。これにより、sleepコマンドを含める目的が無効になります。

1
Karl

ユーザーがサインオンするのを待つ私が使用する関数は次のとおりです。

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
0