Как правильно завершить xvfb-run

Чтобы выполнить некоторые модульные тесты 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 процесс, чтобы другие процессы были правильно очищены?


person dpr    schedule 27.05.2016    source источник


Ответы (1)


Некоторое время назад я разместил этот вопрос на unix.stackexchange.com, поскольку он больше относится к Unix / Linux, чем к программированию в целом, и не привлек здесь особого внимания:

Как правильно завершить xvfb-run в Unix и Linux

Однако единственным вариантом для прекращения корректности X-программ, по-видимому, является отказ от использования xvfb-run и написание собственного скрипта для запуска процессов с помощью Xvfb.

person dpr    schedule 02.11.2016