一部のJavaScriptユニットテストを実行するにはアップDockerコンテナの内部(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
ブラウザを起動して単体テストを実行すると、正常に動作します。テストを実行すると、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
スクリプトが正しく終了し、他のプロセスも終了します。しかし、私のスクリプトではプロセスのPIDだけを知っていますxvfb-run
。
調べて偶然見つけたこのやや古いバグレポートxvfb-run
バグのステータスは2012年に修正されましたが、まだ機能しているようです。
xvfb-run
他のプロセスが適切にクリーンアップされるように、このプロセスを終了する丁寧な方法はありますか?
Stack Overflowにこの質問をしましたが、まだ答えを得ていません。 Stack Overflowに比べて少しOTかもしれませんが、ここが良い場所ですか? !
答え1
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
}
関数を定義したら、次のように呼び出すことができます。使用する代わりにxvfb-run
:
Xvfb :$(find_free_servernum) -screen 0, 1024x768x16 firefox $1 &
THE_PID=$!
# kill Xvfb whenever you feel like it
kill -15 $THE_PID
削除後xvfb-run
:これ以上殺す方法を心配する必要はありませんxvfb-run
。
答え2
今日、この問題が発生しました。
みんなXサーバーこの-terminate
主張を支持してください。
- 終了
続行するのではなく、サーバーをリセットするとサーバーがシャットダウンします。これは以前の -noreset コマンドラインオプションをオーバーライドします。
xvfb-run
だから私は'sを使ってこれを指定しました-s
。
xvfb-run -d -s '-terminate' firefox --no-remote --profile $PROFILE_DIR $URL
したがって、Karmaテストランチャーの例では、Karmaがfirefoxインスタンスを終了すると、Xvfbサーバーは最後のxclient(firefox)が終了したときにそれ自体で終了します。 xvfb-runはFirefoxが終了した後でも実行を完了します。
編集する
私は最終的にxvfb-runスクリプトの「簡単な」バージョンを設定しました。
PROFILE=$(mktemp -d)
trap "rm -rf $PROFILE" EXIT
# Start Xvfb and let it find a display number itself.
# Some versions of Xvfb (apparently 1.17.x) refuse to write to stdout
Xvfb -displayfd 4 -terminate -nolisten tcp 4>$PROFILE/.Xdisplay &
# Wait a few seconds for Xvfb to start
sleep ${START_WAIT-2}
${FIREFOX_HOME}/firefox --profile $PROFILE --no-remote --display :$(<$PROFILE/.Xdisplay) "${@?}" &
# Karma appears to send a SIGTERM to the browser when it's done, forward that signal to the Firefox process.
trap "kill -SIGTERM $!" SIGTERM
# Wait for all children to terminate
wait
答え3
私の解決策は、Dockerエントリポイントスクリプトでxvfbを起動することでした。
Xvfb :0 -screen 0 1024x768x24 &
.bashrc
Dockerを使用していない場合は、ある種のOS起動スクリプト(たとえば)に同じ行を置くこともできます。
次に、他のスクリプトからディスプレイをエクスポートし、使用したい実際の関数を呼び出します。
export DISPLAY=:0
firefox $1