Auteur Sujet: Linux => Comment lancer une application graphique depuis crontab ?  (Lu 4746 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 083
    • Twitter LaFibre.info
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




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)

jack

  • Professionnel des télécoms
  • *
  • Messages: 1 674
  • La Madeleine (59)
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #1 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

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 424
  • Lyon (69) / St-Bernard (01)
    • Twitter
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #2 le: 02 janvier 2018 à 23:24:43 »
gksu ne sert pas à ça ? je m'en servais il y'a longtemps

macmonac

  • Abonné Free fibre
  • *
  • Messages: 204
  • DOUVRES LA DÉLIVRANDE (14)
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #3 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é

Thornhill

  • Abonné SFR fibre FttH
  • *
  • Messages: 3 976
  • Saint-Médard-en-Jalles (33)
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #4 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

vivien

  • Administrateur
  • *
  • Messages: 47 083
    • Twitter LaFibre.info
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #5 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

xtof

  • Abonné Orange Fibre
  • *
  • Messages: 49
  • Le Perreux-sur-Marne (94)
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #6 le: 19 janvier 2018 à 14:08:52 »
Hello
pourquoi ne pas utiliser phantomJs ?
http://phantomjs.org/

vivien

  • Administrateur
  • *
  • Messages: 47 083
    • Twitter LaFibre.info
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #7 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.

xtof

  • Abonné Orange Fibre
  • *
  • Messages: 49
  • Le Perreux-sur-Marne (94)
Linux => Comment lancer une application graphique depuis crontab ?
« Réponse #8 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"