xvfb - 当并行调用多个实例时,xvfb运行不可靠

标签 xvfb

您能帮我吗,为什么我有时会得到帮助(50:50):

webkit_server.NoX11Error: Cannot connect to X. You can try running with xvfb-run.


当我以以下方式并行启动脚本时:

xvfb-run -a python script.py 




您可以这样自己复制:

for ((i=0; i<10; i++)); do
  xvfb-run -a xterm &
done


在xterm的10个实例中,其中9个通常会失败,并出现消息Xvfb failed to start

最佳答案

查看xvfb-run 1.0,其操作如下:



# Find a free server number by looking at .X*-lock files in /tmp.
find_free_servernum() {
    # Sadly, the "local" keyword is not POSIX.  Leave the next line commented in
    # the hope Debian Policy eventually changes to allow it in /bin/sh scripts
    # anyway.
    #local i

    i=$SERVERNUM
    while [ -f /tmp/.X$i-lock ]; do
        i=$(($i + 1))
    done
    echo $i
}


这是非常糟糕的做法:如果同时运行两个find_free_servernum副本,则两个副本都不会知道另一个副本,因此即使只有其中一个副本可以使用,它们也可以确定相同的编号可用。它。

因此,要解决此问题,让我们编写自己的代码以查找免费的显示编号,而不是假定xvfb-run -a可靠运行:

#!/bin/bash

# allow settings to be updated via environment
: "${xvfb_lockdir:=$HOME/.xvfb-locks}"
: "${xvfb_display_min:=99}"
: "${xvfb_display_max:=599}"

# assuming only one user will use this, let's put the locks in our own home directory
# avoids vulnerability to symlink attacks.
mkdir -p -- "$xvfb_lockdir" || exit

i=$xvfb_display_min     # minimum display number
while (( i < xvfb_display_max )); do
  if [ -f "/tmp/.X$i-lock" ]; then                # still avoid an obvious open display
    (( ++i )); continue
  fi
  exec 5>"$xvfb_lockdir/$i" || continue           # open a lockfile
  if flock -x -n 5; then                          # try to lock it
    exec xvfb-run --server-num="$i" "$@" || exit  # if locked, run xvfb-run
  fi
  (( i++ ))
done


如果将此脚本另存为xvfb-run-safe,则可以调用:

xvfb-run-safe python script.py 


...只要您的系统上没有其他用户也在运行xvfb,就不必担心竞争情况。



可以这样测试:

for ((i=0; i<10; i++)); do xvfb-wrap-safe xchat & done


...在这种情况下,所有10个实例都可以正确启动并在后台运行,而不是:

for ((i=0; i<10; i++)); do xvfb-run -a xchat & done


...根据系统的时机,十分之九(通常)会失败。

关于xvfb - 当并行调用多个实例时,xvfb运行不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30332137/

相关文章:

python - xvfb 在 ubuntu 11.04 中运行错误

python - 在 cron 中运行 headless selenium 时,出现错误 "Pyperclip could not find a copy/paste mechanism for your system"

java - 无法使用 java selenium webdriver 将鼠标悬停在 headless 的 Xvfb 中

linux - 在批处理上下文中转发显示

selenium - 如何在 Scrapinghub 上安装 xvfb 以使用 Selenium?

linux -/usr/bin/xvfb-run : line 181: 10208 Killed, 浏览器因 XvFb 进程被自身终止而关闭

docker - xvfb-run 卡在容器中

maven - Selenium Webdriver/TestNG/Maven/Xvfb - 失败时截屏?

amazon-ec2 - 有人用 CentOS 在 EC2 上运行 Xvfb 吗?

centos - Cutycapt、wkhtmltopdf、wkhtmltoimage、phantomjs 无法正确显示字符