編集する

編集する

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

おすすめ記事