$ DISPLAYで指定されたXサーバーに接続できるかどうかをプログラムでテストする方法


8

これはプログラミングとserver-adminの中間点ですが、最終的には最も適切な場所と思われます。

変数 ' $DISPLAY'が実際に接続できるXServerをアドバタイズしているかどうか、つまり、すべての認証とその他のことを実行できるようにするための準備が整っているかどうかを判断する方法を探しています。

私は理想的には、true / falseを返すシェルエンドツールを探しています。これは、ビルドスクリプトで使用して、その中の他のテスト(私が制御しない)を実行する必要があるかどうかを判断できます。

現在のテストでは、単にenv変数 " $DISPLAY"を確認し、そこにある場合は接続を試みます。接続が機能しない場合、テストはテストが失敗したと見なし、ディスプレイに接続できないだけではありません。

できることが必要です

if [[ ! can_connect_to_X ]] ; then 
    unset DISPLAY
fi

深刻な精神的問題を持つこれらのテストを停止するために。

理想的な状況では、これを実行するために必要なツールは、Xクライアントライブラリ自体に付属している必要があります。これにより、特別な依存関係が発生したり、ユーティリティがそこにない場合は、どのディスプレイにも接続できません。

回答:



2

より良い解決策があると思います。ただし、xclockなどの小さなツールを使用して、終了ステータスをいつでも確認できます。

if [[ ! xclock ]]; then
  exit 1
fi
pkill xclock

しかし、男、それ醜いです:-)

ハックを少なくするには、以下をcheckX.cに入れます。

#include <X11/Xlib.h>
#include <stdio.h>

int main() 
{
    Display *display;
    if( ! (display=XOpenDisplay(NULL) ) ) {
        return(1);
    }
    return 0;
}

次に:

gcc -lX11 checkX.c -o checkX
chmod +x checkX

最後に:

if ./checkX; then
   echo "We are good to go!"
fi

ええ、それは私が最初に検討したことですが、視覚的にウィンドウを作成しないものを望んでいました:/。私はxclock&をして、それを殺すことさえ考えました。
ケントフレドリック

xclock -geometry 1x1は、視覚的な侵入を排除するために私ができる最善の方法です:/しかし、タスクバーにタスクスペースを割り当てます:(
Kent Fredric '26

それは私がCで書いた最初のXプログラムなので、完全に信頼できるかどうかはわかりません:-)
カイル・ブラント

そして、最もポータブルなものではありません;-)
カイル・ブラント

これは非常に便利ですが、残念ながら私の制約はやや厳しくなっています。正直に言って、私はebuild(gentoo)を書いているので、シェルで/ everything /を実質的に実行する必要があり、アプリは事前にそこにあると想定し、事前にサードパーティのアプリにバイナリBLOBを追加することはできません:)
ケントフレドリック

1

考えられるWayToDoItがここにありますが、それがどれほど優れているかはわかりません。

  x_works(){
     # If there is no xdpyinfo
     # Bash will return 127
     # If X cant connect, it returns 1
     # If X can connect, it returns 0
     xdpyinfo 1>/dev/null 2>&1
     WORKS="$?"
     return $WORKS
  }

  if x_works; then 
   ...

これは機能しているようです。


私のFedora 11マシンでは、次のようになっています。$ xdpyinfo 1使用法:xdpyinfo [オプション]とにかく、xdpyinfoプログラムを使用するのは良い考えのように思えます。
クリスティアンCiupitu 2009

'1' bashのstderrリダイレクトがあります;)、xdpyinfo paramではありません:)
Kent Fredric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.