6 votes

Comment terminer xvfb-run correctement

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 ?

3voto

dpr Points 4084

J'ai posté cette question sur unix.stackexchange.com il y a quelque temps, car elle est davantage liée à Unix/Linux qu'à la programmation en général et n'a pas attiré beaucoup d'attention ici :

Comment terminer xvfb-run correctement @ Unix & Linux

Cependant, la seule option pour terminer les programmes X de manière correcte semble être de ne pas utiliser xvfb-run et d'écrire votre propre script pour démarrer les processus avec Xvfb.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X