Xvfb 不发送 SIGUSR1,破坏了 xvfb-run

Xvfb 不发送 SIGUSR1,破坏了 xvfb-run

我一直在解决一个棘手的问题,试图使用提供的 xvfb-run 脚本来运行无头测试Xvfb。它适用于我自己在 VirtualBox 中运行的 Ubuntu 映像,但在 Atlassian 为 Elastic Bamboo 提供的 Ubuntu 15.04 AMI 上则不然。我已经将问题追溯到这里:

xvfb-运行:

...
# 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
...

脚本进入“等待”状态,但从未从 Xvfb 获得预期的 SIGUSR1。 (如果我手动发送 SIGUSR1,脚本将正常进行)。我将所有软件包更新为最新版本,但仍然不喜欢,这很奇怪,因为我可以让它在其他 Ubuntu 系统上工作。 xvfb 错误日志 ($ERRORFILE) 已创建,但其中没有任何内容。

对根本原因的思考,或者至少进行更深入的研究?

答案1

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

答案2

对于在没有 Atlassian 包装脚本的情况下使用其他图像遇到相同症状的其他人:

使用 xvfb-run 作为容器的主(init)进程显然会破坏其内部信号处理,也会导致wait挂起。通过使用 init 进程来解决这个问题,例如蒂尼,通过将其添加到容器中或使用docker run --init.

相关内容