Afin d'effectuer des tests unitaires JavaScript avec karma à l'intérieur d'un conteneur docker (basé sur ubuntu 14.04), je démarre firefox dans le conteneur à l'aide d'une commande Lanceur de karma-script con xvfb-run
. Le script de départ ressemble à ceci :
#!/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
Le démarrage du navigateur et l'exécution des tests unitaires fonctionnent très bien. Après l'exécution des tests, Karma termine l'instance de navigateur créée - dans mon cas, le script qui a lancé firefox sur xvfb-run.
Dans le script ci-dessus, vous pouvez voir que j'ai enregistré un trap
pour tuer le firefox lancé à la sortie de mon script. Cela fonctionne, mais le script n'est pas un citoyen très gentil car il termine tous instances de firefox qui sont actuellement en cours d'exécution au lieu de terminer uniquement l'instance qui a été lancée par le script. J'ai d'abord essayé de tuer le xfvb-run
mais le fait de tuer ce processus n'a aucun effet sur le sous-processus lancé par la commande xvfb-run
script...
Si je redémarre firefox xvfb-run
manuellement, il y a un tas de processus créés :
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#
Si je tue maintenant le xvfb-run
(PID 348), seul ce processus sera interrompu, laissant les autres processus en cours d'exécution. Si je tue le processus firefox (PID 361) à la place, le processus xvfb-run
script termine et tue correctement les autres processus également. Mais à partir de mon script je connais seulement le PID du xvfb-run
processus...
Pendant mes recherches, je suis tombé sur ce rapport de bogue plutôt ancien pour xvfb-run
qui semble toujours être valide malgré le fait que le bug ait été corrigé en 2012.
Existe-t-il une manière polie de mettre fin à la xvfb-run
pour que les autres processus soient nettoyés correctement ?