La Fibre

Télécom => Logiciels et systèmes d'exploitation => Linux Linux => Discussion démarrée par: vivien le 02 janvier 2018 à 22:26:49

Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: vivien le 02 janvier 2018 à 22:26:49
Il est possible, via ChromeDriver de piloter un navigateur : Chrome, Chromium ou Firefox.
Je cherche à faire un petit programme en python, qui permet de remonter le temps d'affichage réel d'une page web, dans un vrai navigateur.

ChromeDriver sera lancé régulièrement depuis la crontab et dans ce cas là il n'arrive pas à déterminer dans quel écran envoyer chrome (je voudrais que cela soit sur l'écran par défaut)
=> Comment forcer un programme graphique démarré par crontab à utiliser l’environnement graphique par défaut au lieu de sortir en erreur ?

La documentation de ChromeDriver est ici : https://sites.google.com/a/chromium.org/chromedriver/

Voici le contenu de mon fichier test.py pour démo :

#!/usr/bin/env python2

import time
from selenium import webdriver

driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver')  # Optional argument, if not specified will search path.
driver.get('https://lafibre.info/');
print "Ouvert"
time.sleep(3)
driver.quit()
print "Ferme"

Voici les pré-requis pour ce script python, sous Ubuntu / Debian :
sudo apt install chromium-browser chromium-chromedriver python-pip
sudo pip install --upgrade pip
sudo pip install selenium



Si je lance mon script depuis un terminal, lui même lancé depuis l'interface graphique de mon Ubuntu, tout fonctionne (chromium se lance et charge la page web) et j'ai ceci en ligne de commande :
$ ./test.py
Ouvert
Ferme

(https://lafibre.info/testdebit/ubuntu/201801_ChromeDriver_pilote_navigateur.png)


Si je lance mon script depuis un terminal lancé depuis SSH ou depuis la crontab, après une attente d'une minute, j'ai cette erreur et chomium ne s'est pas lancé :
$ ./test.py
Traceback (most recent call last):
  File "./test.py", line 6, in <module>
    driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver')  # Optional argument, if not specified will search path.
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/chrome/webdriver.py", line 75, in __init__
    desired_capabilities=desired_capabilities)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 154, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 243, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 311, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.33,platform=Linux 4.13.0-21-generic x86_64)
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: jack le 02 janvier 2018 à 23:00:33
Au feeling:

Activer la connexion à ton X pour un tiers:
xhost +

Configurer le serveur X à utiliser:
export DISPLAY=:0
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: Hugues le 02 janvier 2018 à 23:24:43
gksu ne sert pas à ça ? je m'en servais il y'a longtemps
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: macmonac le 02 janvier 2018 à 23:52:38
Bonjour,
 
Ton problème vient probablement de variables d'environnement non positionnées. La première pourrait donc être de les positionner.

Dans quel environnement s'exécute ton programme et ton navigateur ? Sur ta session ? Sur un environnement type VNC/X2GO ?

Pourquoi tu utilises cron ? Moi je ferais un while true avec un sleep et éventuellement si vraiment tu veux des heures régulières tu peux utiliser un module cron pour python.

A+

PS modifier le xhost pas forcèment une bonne idée au niveau sécurité
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: Thornhill le 03 janvier 2018 à 00:51:40
Si tu as la certitude que ton serveur X est bien actif lors du job cron, il suffit de positionner DISPLAY et XAUTHORITY avec les bonnes valeurs.

export DISPLAY=:0.0
export XAUTHORITY=/somewhere/.Xauthority

Une autre alternative est d'utiliser un serveur X virtuel dédié comme Xvfb qui sert justement à tester des clients X11 sans avoir besoin d'affichage réel.

Xvfb :15 &
export DISPLAY=:15
monprog

ou bien

xvfb-run monprog
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: vivien le 03 janvier 2018 à 11:57:37
Merci beaucoup.

Comme le test est lancé par le même utilisateur que celui qui à lancé l'interface graphique la solution est assez simple : rajouter DISPLAY=:0 devant le nom du script

Quand je me connecte à SSH DISPLAY=:0 ./test.py affiche bien le navigateur web sur l'écran de la machine qui l’exécute.

Je pense que cela fonctionne aussi parfaitement avec la crontab en préfixant le script par DISPLAY=:0
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: xtof le 19 janvier 2018 à 14:08:52
Hello
pourquoi ne pas utiliser phantomJs ?
http://phantomjs.org/
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: vivien le 19 janvier 2018 à 14:30:19
La réponse est simple : phantomJs est bien moins représentatif qu'un vrai navigateur.

Pour l'avoir utilisé, il a aussi besoin d'une interface graphique : sur un Ubuntu server sans interface, mon script ne fonctionne pas.
Titre: Linux => Comment lancer une application graphique depuis crontab ?
Posté par: xtof le 19 janvier 2018 à 14:34:14
Je l'utilise sur des serveurs - donc pas d'interface graphique - et ça fonctionne.

DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"