2016-05-27 13 views
2

Um einige JavaScript Unit-Tests mit in einem Docker-Container (basierend auf Ubuntu 14.04) durchzuführen, starte ich Firefox im Container mit einem karma-script-launcher mit xvfb-run. Das Startskript sieht so aus:Howto terminieren xvfb-run richtig

#!/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 

Starten des Browsers und Ausführen der Komponententests funktioniert sehr gut. Nach dem Ausführen der Tests beendet Karma die erstellte Browser-Instanz - in meinem Fall das Skript, das Firefox über xvfb-run gestartet hat.

In dem obigen Skript können Sie sehen, dass ich ein trap registriert, um die gestartete Firefox beim Beenden meines Skripts zu töten. Das funktioniert, aber das Skript ist kein sehr netter Bürger, da es alle Instanzen von Firefox, die gerade ausgeführt werden, beendet anstatt nur die eine Instanz zu beenden, die vom Skript gestartet wurde. Ich versuchte zunächst, den xfvb-run Prozess zu töten, aber diesen Prozess zu töten hat keine Auswirkungen auf den Teilprozess durch das Skript xvfb-run gestartet ...

Wenn ich firefox über xvfb-run manuell starten, gibt es eine Reihe von gelaicht Prozesse:

[email protected]:/data# xvfb-run --auto-servernum --server-args='-screen 0, 1024x768x16' firefox & 
[1] 348 
[email protected]:/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 
[email protected]:/data# 

Wenn ich jetzt den Prozess xvfb-run (PID 348) abbricht, wird nur dieser Prozess beendet, so dass die anderen Prozesse ausgeführt werden. Wenn ich stattdessen den Firefox-Prozess (PID 361) abbringe, beendet das Skript xvfb-run die anderen Prozesse ebenfalls ordnungsgemäß und beendet sie. Aber von meinem Skript weiß, dass ich nur die PID des xvfb-run Prozess ...

Während meiner Forschung, die ich für xvfb-run über this rather old bug report gestolpert, die noch trotz des Status gültig zu sein scheint der Fehler behoben beeing im Jahr 2012 zurück

Gibt es eine höfliche Möglichkeit, den Prozess xvfb-run zu beenden, damit die anderen Prozesse ordnungsgemäß bereinigt werden?

Antwort

0

Ich stellte diese Frage auf unix.stackexchange.com vor einiger Zeit, da dies zu Unix/Linux mehr verwandt ist als die Programmierung im Allgemeinen und viel Aufmerksamkeit haben hier nicht anziehen:

Howto terminate xvfb-run properly @ Unix & Linux

jedoch die Nur die Option, die X-Programme korrekt zu beenden, scheint die nicht zu sein, xvfb-run zu verwenden und ein eigenes Skript zu schreiben, um die Prozesse mit Xvfb zu starten.