为了在docker容器(基于ubuntu 14.04)中使用karma执行一些JavaScript单元测试,我使用karma-script-launcher xvfb-run
在容器中启动firefox 。启动脚本如下所示:
#!/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
启动浏览器并执行单元测试非常有效。执行测试后,karma终止了生成的浏览器实例 - 在我的例子中是通过xvfb-run启动firefox的脚本。
在上面的脚本中,您可以看到我在我的脚本退出时注册了trap
来杀死已启动的firefox。这是有效的,但脚本不是一个非常好的公民,因为它终止当前正在运行的所有的firefox实例,而不是仅仅终止脚本启动的一个实例。我首先尝试杀死xfvb-run
进程,但是杀死此进程对xvfb-run
脚本启动的子进程没有影响......
如果我手动启动firefox而不是xvfb-run
,则会产生一系列衍生进程:
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#
如果我现在终止xvfb-run
进程(PID 348),则只会终止此进程,而其他进程将继续运行。如果我取消了firefox进程(PID 361),xvfb-run
脚本也会正确终止并杀死其他进程。但是从我的脚本中我只知道xvfb-run
进程的PID ......
在我的研究过程中,我偶然发现了xvfb-run
xvfb-run
{{}}},尽管2012年错误的状态已经得到修复,但仍然有效。{/ p>
有没有礼貌的方法来终止{{1}}进程,以便正确清理其他进程?
答案 0 :(得分:2)
我之前在unix.stackexchange.com上发布了这个问题,因为这与Unix / Linux的关系比一般的编程更多,并且在这里没有引起太多关注:
Howto terminate xvfb-run properly @ Unix & Linux
然而,终止X-program correclty的唯一选择似乎是不使用xvfb-run并编写自己的脚本以使用Xvfb启动进程。