如何轮询Xvfb准备好了?


11

特拉维斯CI文件说,运行sleep 3开始后xvfb,以“给[它]一段时间来启动”。我在man页面中找不到对此延迟的任何引用。这是货物崇拜的节目吗?如果没有,我该如何轮询而不是睡觉以保证它可用?

Answers:


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

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)。


谢谢!仅xdpyinfo一行就足够了;循环可以一百万种不同的方式完成。
l0b0

当然可以用很多方法来完成。但是,此代码片段创建了打印精美的输出,还使您了解了Xvfb准备就绪需要花费多少时间。我写了这本书供自己使用,但意识到其他人也可以从中受益。
安东
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.