如何正确终止 xvfb-run

dpr*_*dpr 6 bash xvfb

为了执行与一些JavaScript单元测试因缘泊坞窗容器内(基于Ubuntu 14.04),我使用的是火狐开始在容器卡玛-脚本启动xvfb-run。启动脚本如下所示:

#!/bin/bash
set -o errexit 

# nasty workaround as xvfb-run doesn't cleanup properly...
trap "pkill -f /usr/lib/firefox/firefox" EXIT

xvfb-run --auto-servernum --server-args='-screen 0, 1024x768x16' firefox $1
Run Code Online (Sandbox Code Playgroud)

启动浏览器并执行单元测试效果很好。执行测试后 karma 终止生成的浏览器实例 - 在我的例子中是通过 xvfb-run 启动 firefox 的脚本。

在上面的脚本中,您可以看到我trap在退出脚本时注册了一个来杀死启动的 Firefox。这有效,但该脚本不是一个很好的公民,因为它终止当前正在运行的所有Firefox 实例,而不是仅仅终止由脚本启动的一个实例。我首先尝试杀死该xfvb-run进程但杀死此进程对xvfb-run脚本启动的子进程没有影响......

如果我xvfb-run手动启动 Firefox,则会产生一堆生成的进程:

root@1d7a5988e521:/data# xvfb-run --auto-servernum --server-args='-screen 0, 1024x768x16' firefox &
[1] 348
root@1d7a5988e521:/data# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 bash
  348 ?        S      0:00 /bin/sh /usr/bin/xvfb-run --auto-servernum --server-args=-screen 0, 1024x768x16 firefox
  360 ?        S      0:00 Xvfb :99 -screen 0, 1024x768x16 -nolisten tcp -auth /tmp/xvfb-run.bgMEuq/Xauthority
  361 ?        Sl     0:00 /usr/lib/firefox/firefox
  378 ?        S      0:00 dbus-launch --autolaunch bcf665e095759bae9fc1929b57455cad --binary-syntax --close-stderr
  379 ?        Ss     0:00 //bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
  388 ?        S      0:00 /usr/lib/x86_64-linux-gnu/gconf/gconfd-2
  414 ?        R+     0:00 ps ax
root@1d7a5988e521:/data#
Run Code Online (Sandbox Code Playgroud)

如果我现在xvfb-run终止进程 (PID 348),则只会终止该进程,而让其他进程继续运行。如果我改为xvfb-run终止firefox 进程(PID 361),脚本会正确终止并终止其他进程。但是从我的脚本中我只知道xvfb-run进程的 PID ......

在我的研究,我偶然发现这个相当老的bug报告xvfb-run这似乎仍然是尽管错误的状态在2012年beeing固定靠背有效。

是否有任何礼貌的方式来终止xvfb-run进程以便正确清理其他进程?


我已经在 Stack Overflow 上问过这个问题,但直到现在还没有得到答复。也许它对于 Stack Overflow 来说有点过时,但更适合在这里?!

Bir*_*abs 7

听起来您只是在使用xvfb-run它的--auto-servernum功能。

正如@meuh 指出的那样:这个逻辑实际上非常简单

# Copyright (C) 2005 The T2 SDE Project
# Copyright (C) XXXX - 2005 Debian
# GNU GPLv2
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
}
Run Code Online (Sandbox Code Playgroud)

定义该函数后:您可以尝试这样的调用,而不是使用xvfb-run

Xvfb :$(find_free_servernum) -screen 0, 1024x768x16 firefox $1 &
THE_PID=$!
# kill Xvfb whenever you feel like it
kill -15 $THE_PID
Run Code Online (Sandbox Code Playgroud)

随着xvfb-run去除:我们不再需要了解如何杀死担心xvfb-run