Xvfbを準備するためにポーリングする方法は?


11

トラヴィスCIのドキュメントでは、実行するように言いsleep 3始めた後xvfb、「ギブ[それ]を開始するいくつかの時間」へ。manページのこの遅延についての参照は見つかりませんでした。これはカーゴカルトプログラミングですか?そうでない場合、それが利用可能であることを保証するために、スリープはなくポーリングをどのように行うのですか?

回答:


6

デフォルトでXvfbは、クライアントが接続するためのUnixドメインソケットを作成します。私のシステムでは、このファイルソケットファイルはで作成され/tmp/.X11-unix/ます。inotifywaitこのディレクトリでイベントをリッスンするために使用できます。例えば、

 $ inotifywait -e create /tmp/.X11-unix/

次に実行しますXvfb :9(ディスプレイ9など)。準備ができたら、

/tmp/.X11-unix/ CREATE X9

からinotifywait終了します。これでに接続できるようになりDISPLAY=:9ます。


これは、適切なジョブ制御が期待できるシステムで機能しますが、Travis CI構成ファイルでこれを実行しようとしています。バックグラウンドジョブを使用して、完了するまで待つことができるとは思えません。
l0b0 2016

3
シンプルなものがwhile [ ! -e /tmp/.X11-unix/X99 ]; do sleep 0.1; done実際にトリックを行いました。パスのヒントのため、解決済みとマークしています。
l0b0

1

本格的なスクリプトを実行できる人のために、別のオプションはxdpyinfo目的のディスプレイで使用することです:

# Start Xvfb
sudo /usr/bin/Xvfb ${DISPLAY} -screen 0 1280x800x24 &

# Wait for Xvfb
MAX_ATTEMPTS=120 # About 60 seconds
COUNT=0
echo -n "Waiting for Xvfb to be ready..."
while ! xdpyinfo -display ${DISPLAY} >/dev/null 2>&1; do
  echo -n "."
  sleep 0.50s
  COUNT=$(( COUNT + 1 ))
  if [ "${COUNT}" -ge "${MAX_ATTEMPTS}" ]; then
    echo "  Gave up waiting for X server on ${DISPLAY}"
    exit 1
  fi
done
echo "  Done - Xvfb is ready!"

https://gist.github.com/tullmann/476cc71169295d5c3fe6に触発された回答)。


ありがとう!たった1 xdpyinfo行で十分です。ループは100万通りの方法で実行できます。
l0b0

確かにそれは多くの方法で行うことができます。ただし、このスニペットはきれいに印刷された出力を作成します。これにより、Xvfbの準備が完了するまでにかかった時間もわかります。私は自分で使用するためにそれを書きましたが、他の人もそれから利益を得ることができることに気づきました。
アントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.