Comment démarrer Xvfb au démarrage sur Debian?

9

J'ai un serveur Web Debian que j'utilise pour le grattage d'écran occasionnel via Selenum et Python.

J'utilise Xvfb comme serveur X virtuel sur lequel Firefox s'exécute lorsqu'il est contrôlé par Selenium. Étant donné que je (pense) que je dois commencer à utiliser cela sudo, je ne pense pas qu'il soit possible de le démarrer à partir de Python à chaque fois (voir ma question Stack Overflow ), alors j'ai pensé que je pouvais simplement le faire fonctionner tout le temps .

Je le démarre actuellement comme ceci sur la ligne de commande:

sudo Xvfb :99 -nolisten tcp -fbdir /var/run

Quelle méthode dois-je utiliser pour le faire automatiquement au démarrage? Dois-je utiliser cron, comme suggéré ici ?

Paul D. Waite
la source

Réponses:

6

Sur debian, vous pouvez ajouter la commande Xvfb à /etc/rc.local. Si Xvfb ne se détache pas en arrière-plan, utilisez un &à la fin de la commande.

L'utilisation de cron fonctionnerait également, bien que les scripts d'initialisation vous donnent plus de contrôle sur le moment exact de l'exécution de la séquence de démarrage et constituent la manière traditionnelle de démarrer les services.

Andy
la source
Aha, excellent. L'édition est-elle /etc/rc.localpréférable à l'utilisation update-rc.davec ses propres scripts individuels?
Paul D. Waite
2
@Paul, je dirais que update-rc.dc'est préférable et qu'il est certainement plus performant, mais rc.localc'est plus rapide et plus facile. De plus, je pense que Gilles a raison, il n'y a aucune raison pour que cela fonctionne comme root.
Andy
4

Votre prémisse n'est pas valide: il n'y a aucune raison d'exécuter Xvfb en tant que root. Votre serveur X habituel ne doit s'exécuter qu'en tant que root (sur de nombreux mais pas sur tous les appareils) uniquement pour pouvoir accéder au matériel vidéo; ce n'est pas un problème pour Xvfb par définition.

Si vous souhaitez exécuter Xvfb au démarrage, vous pouvez utiliser cron en @rebootremplaçant les cinq champs de date et d'heure. Vous pouvez le faire dans la crontab de n'importe quel utilisateur, pas seulement dans la racine. Mais je ne vois pas l'intérêt. Vos scripts seraient plus robustes si vous démarriez Xvfb quand vous en avez besoin, exactement comme vous semblez l'avoir initialement prévu.

Gilles 'SO- arrête d'être méchant'
la source
Point valide. Pour exécuter Xvfb pour une seule commande, vous pouvez utiliser la xvfb-runcommande qui est généralement livrée avec Xvfb. Voici la référence cli pour xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.fr.html . @Paul, vous pouvez l'exécuter comme suit:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow
4

Comme l'a suggéré @Gilles , il est plus approprié de fonctionner à la demande, en particulier lorsque vous l'utilisez pour les tests de sélénium. Voici des exemples de commandes shell:

export DISPLAY=:99
xdpyinfo -display $DISPLAY > /dev/null || Xvfb $DISPLAY -screen 0 1024x768x16 &

La vérification de l'affichage en utilisant xdpyinfoavant vous assurera de ne pas exécuter le framebuffer virtuel deux fois.


Si vous avez vraiment besoin de le démarrer au démarrage, vous pouvez essayer le script init.d suivant :

#!/bin/sh
XVFB=/usr/bin/Xvfb
XVFBARGS=":1 -screen 0 1024x768x24 -ac +extension GLX +render -noreset -nolisten tcp"
PIDFILE=/var/run/xvfb.pid
case "$1" in
  start)
    echo -n "Starting virtual X frame buffer: Xvfb"
    start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
    echo "."
    ;;
  stop)
    echo -n "Stopping virtual X frame buffer: Xvfb"
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    echo "."
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
        echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
        exit 1
esac

exit 0

Source: dloman / xvfb sur GitHub ( dérivé de: jterrace / xvfb )

Enregistrez-le sous /etc/init.d/xvfbet rendez-le exécutable, puis démarrez-le comme:

/etc/init.d/xvfb start

Pour s'exécuter automatiquement au démarrage, exécutez:

sudo update-rc.d xvfb defaults

Pour le supprimer de l'exécution automatique, exécutez:

sudo update-rc.d -f xvfb remove

Ajoutez également au environmentfichier pour être reconnu par les programmes X, par exemple:

echo DISPLAY=":1" | sudo tee -a /etc/environment

Voici la version pour la version systemd: dloman / xvfb.service .

Kenorb
la source
Je sais que cela a un an, mais ne semble pas obtenir une version de sélénium javascript pour fonctionner avec cela. Si je lance après le démarrage, cela fonctionne mais quand je le démarre en tant que service, c'est comme s'il ne détectait pas xvfb. Avez-vous une idée de la façon dont je peux faire fonctionner les deux en tant que services au démarrage?
Masinde Muliro
@MasindeMuliro Vous pouvez alors poser une autre question, afin que les réponses puissent être plus mises à jour pour être spécifiques à votre problème.
kenorb