トラヴィスCIのドキュメントでは、実行するように言いsleep 3
始めた後xvfb
、「ギブ[それ]を開始するいくつかの時間」へ。man
ページのこの遅延についての参照は見つかりませんでした。これはカーゴカルトプログラミングですか?そうでない場合、それが利用可能であることを保証するために、スリープではなくポーリングをどのように行うのですか?
トラヴィスCIのドキュメントでは、実行するように言いsleep 3
始めた後xvfb
、「ギブ[それ]を開始するいくつかの時間」へ。man
ページのこの遅延についての参照は見つかりませんでした。これはカーゴカルトプログラミングですか?そうでない場合、それが利用可能であることを保証するために、スリープではなくポーリングをどのように行うのですか?
回答:
デフォルトでXvfb
は、クライアントが接続するためのUnixドメインソケットを作成します。私のシステムでは、このファイルソケットファイルはで作成され/tmp/.X11-unix/
ます。inotifywait
このディレクトリでイベントをリッスンするために使用できます。例えば、
$ inotifywait -e create /tmp/.X11-unix/
次に実行しますXvfb :9
(ディスプレイ9など)。準備ができたら、
/tmp/.X11-unix/ CREATE X9
からinotifywait
終了します。これでに接続できるようになりDISPLAY=:9
ます。
while [ ! -e /tmp/.X11-unix/X99 ]; do sleep 0.1; done
実際にトリックを行いました。パスのヒントのため、解決済みとマークしています。
本格的なスクリプトを実行できる人のために、別のオプションは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に触発された回答)。
xdpyinfo
行で十分です。ループは100万通りの方法で実行できます。