为了执行与一些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 来说有点过时,但更适合在这里?!
听起来您只是在使用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
。