如何正确终止xvfb-run

dpr*_*dpr 5 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),则只会终止此进程,而其他进程将继续运行.如果我取消了firefox进程(PID 361),xvfb-run脚本会正确终止并杀死其他进程.但是从我的脚本中我只知道xvfb-run过程的PID ...

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

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

dpr*_*dpr 3

我不久前在 unix.stackexchange.com 上发布了这个问题,因为这与 Unix/Linux 相关而不是与一般编程相关,并且在这里没有引起太多关注:

如何正确终止 xvfb-run @ Unix 和 Linux

然而,正确终止 X 程序的唯一选择似乎是不使用 xvfb-run 并编写自己的脚本来使用 Xvfb 启动进程。