Чтобы выполнить некоторые модульные тесты JavaScript с помощью karma внутри контейнера докеров (на основе ubuntu 14.04), я Запускаю firefox в контейнере с помощью karma-script-launcher с 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 завершает работу созданного экземпляра браузера - в моем случае скрипт, запустивший firefox через xvfb-run.
В приведенном выше сценарии вы можете видеть, что я зарегистрировал 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
процесс, чтобы другие процессы были правильно очищены?