xvfb-run 在 AWS 上的 Elastic Bamboo 的 Ubuntu 15.04 AMI 中因陷阱/等待而挂起

xvfb-run 在 AWS 上的 Elastic Bamboo 的 Ubuntu 15.04 AMI 中因陷阱/等待而挂起

我正在尝试在 AWS EC2 中的 Ubuntu 15.04 上使用 Xvfb 通过 Elastic Bamboo 运行一些无头机器人/Selenium 测试。如果我手动运行 Xvfb,然后运行测试,它就会起作用...

export display=:99
Xvfb :99 -screen 0 1024x768x24 -nolisten tcp -ac &
pybot --nostatusrc --variablefile variables/vars.py -e TBD -e broken -x xunit -d reports/ tests/
<test output appears>

但我想使用提供的 xvfb-run 脚本,这样我就可以并行运行一堆测试,并让它们使用不同的显示器。当我通过 xvfb-run 运行它时,它挂起了,没有输出,永远不会终止。

xvfb-run -a -e /dev/stdout --nostatusrc --variablefile variables/vars.py -e TBD -e broken -x xunit -d reports/ tests/
<hangs>

在 /usr/bin/xvfb-run 脚本中,这是功能的核心:

# Start Xvfb.
MCOOKIE=$(mcookie)
tries=10
while [ $tries -gt 0 ]; do
    tries=$(( $tries - 1 ))
    XAUTHORITY=$AUTHFILE xauth source - << EOF >>"$ERRORFILE" 2>&1
add :$SERVERNUM $XAUTHPROTO $MCOOKIE
EOF
    # handle SIGUSR1 so Xvfb knows to send a signal when it's ready to accept
    # connections
    trap : USR1
    (trap '' USR1; exec Xvfb ":$SERVERNUM" $XVFBARGS $LISTENTCP -auth $AUTHFILE >>"$ERRORFILE" 2>&1) &
    XVFBPID=$!
    wait || :
    if kill -0 $XVFBPID 2>/dev/null; then
        break
    elif [ -n "$AUTONUM" ]; then
        # The display is in use so try another one (if '-a' was specified).
        SERVERNUM=$((SERVERNUM + 1))
        SERVERNUM=$(find_free_servernum)
        continue
    fi
    error "Xvfb failed to start" >&2
    XVFBPID=
    exit 1
done

stdout 中没有显示任何内容(如果我将其设置为文件,则不会显示日志)。因此,我编辑了 xvfb-run 以设置 -x,结果脚本进入 exec 然后挂起:

...
16-Nov-2015 14:36:52    + xauth source -
16-Nov-2015 14:36:52    + trap : USR1
16-Nov-2015 14:36:52    + XVFBPID=6123
16-Nov-2015 14:36:52    + wait
16-Nov-2015 14:36:52    + trap '' USR1
16-Nov-2015 14:36:52    + exec Xvfb :99 -screen 0 640x480x8 -nolisten tcp -auth /tmp/xvfb-run.js9dgH/Xauthority
<hangs here>

通过进一步观察,可以发现它正在“等待”,并期望子进程发回 SIGUSR1 以继续运行,但它要么从未从 Xvfb 发送,要么没有被 shell 正确接收。

有人知道这个问题可能是什么吗?

它可以在 VirtualBox 中的 Ubuntu 15.10 桌面、VirtualBox 中的 Ubuntu 15.10 服务器以及 EC2 中的普通 Canonical Ubuntu AMI(ami-3ad5af50)上运行,因此它必须是 Atlassian 配置的 Ubuntu AMI 所特有的东西,但我无法弄清楚是什么...我手动将其 AMI 中的一个实例升级到 15.10,但这并没有解决问题。

答案1

啊,没关系,我终于找到了问题所在 - Atlassian 添加了他们自己的 Xvfb 包装器脚本 (/usr/local/bin/Xvfb),该脚本阻止了信号发送。对于将来遇到此问题的人,请检查 Xvfb 是直接执行还是通过包装器执行,如果是包装器,它将破坏 xvfb-run。

相关内容