編集する

編集する

一部の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 &

.bashrcDockerを使用していない場合は、ある種のOS起動スクリプト(たとえば)に同じ行を置くこともできます。

次に、他のスクリプトからディスプレイをエクスポートし、使用したい実際の関数を呼び出します。

export DISPLAY=:0
firefox $1

関連情報